2016-09-29 117 views
0

我在幼蟲中使用hasManythrough關係存在問題。只要後續的使用例如,有文檔,它們是:Laravel的問題有很多關係

countries 
id - integer 
name - string 

users 
id - integer 
country_id - integer 
name - string 

posts 
id - integer 
user_id - integer 
title - string 

這裏是我設置的模式

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Country extends Model 
{ 
public function posts() { 

    return $this->hasManyThrough('App\Post', 'App\User', 'user_id', 'country_id', 'id'); 
} 
} 

這裏的關係是用戶模型

class User extends Authenticatable 
{ 
use Notifiable; 

/** 
* The attributes that are mass assignable. 
* 
* @var array 
*/ 
protected $fillable = [ 
    'name', 'email', 'password', 
]; 

/** 
* The attributes that should be hidden for arrays. 
* 
* @var array 
*/ 
protected $hidden = [ 
    'password', 'remember_token', 
]; 

public function posts() { 
    return $this->hasMany('App\Post'); 
} 

public function country() { 
    return $this->hasOne('App\User'); 
} 
} 

這裏是帖子型號

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Post extends Model 
{ 
    public function user() { 

    return $this->belongsTo('App\User'); 
} 
} 

因此,該網站沒有詳細瞭解如何通過國家模式提取帖子。使用路由文件,這是我用

Route::get('posts/countries/{id}', function($id) { 

$countries = App\Country::where('id', $id)->get(); 

return $countries->posts; 

}); 

查詢它看起來對我來說,我建立關係正確的文檔說的方式。用戶表上有一個country_id,所以我不確定查詢是錯誤的還是我確實錯誤地設置了關係。

回答

0

你實際上並沒有要求關係,你只是在查看國家的屬性。

如果您想提前查詢構建器中的帖子,則需要在構建查詢時添加with('posts')。 (致電前->get()其執行查詢並把它變成一個集合。)

Route::get('posts/countries/{id}', function($id) { 

$country = App\Country::with('posts')->where('id', $id)->first(); 

return $country->posts; 

}); 

或者,如果你想lazyload你可以通過做->posts()這樣的要求對全國模型的關係:

Route::get('posts/countries/{id}', function($id) { 

$country = App\Country::with('posts')->where('id', $id)->first(); 

return $country->posts(); 

}); 

注意:在這兩種情況下,我將->get()更改爲->first()。我假設你只想要返回一個國家的帖子。

->get()執行查詢並將相關模型作爲集合返回,->first()從查詢中獲取第一個模型。

0

@尼克拉斯凱文弗蘭克

您的解決方案沒有爲我工作。至少不是完全的,但你在某些方面是對的。我修修補補四周,發現查詢像這樣工作更好:

Route::get('posts/countries/{id}', function($id) { 

$country = App\Country::where('id', $id)->first(); 

return view('country')->with('country', $country); 
}); 

所以,像你說的,它膽怯所需的 - >第一個()的選項,但它並不需要用(「職位」 )部分。但非常感謝我的朋友。沒有你,我無法解決這個問題。