2016-09-29 9 views
0

larvalでhasManythrough関係を使用する際に問題が発生しています。ちょうどである、そこに例を使用してドキュメントを次Laravel withManyThrough関係の問題

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'); 
} 
} 

を設定する方法であるUserモデルは

ここ
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'); 
} 
} 

したがって、ウェブサイトは、国モデルを通じた投稿の抽出方法に関する詳細な説明は行っていません。 routesファイルを使用して、これは私が正しくドキュメントが言うに道を関係を設定するようですが、私には見えます私は

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

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

return $countries->posts; 

}); 

を使用したクエリです。ユーザーテーブルにcountry_idがあるので、クエリが間違っているかどうか、または間違ってリレーションシップを設定したかどうかはわかりません。

答えて

0

実際には関係を要求していないため、単に国の属性を調べているだけです。

クエリビルダの投稿をeagerloadする場合は、クエリを作成するときにwith('posts')を追加する必要があります。

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

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

return $country->posts; 

}); 

を(。あなたは、クエリを実行し、コレクションに変換します->get()を呼び出す前)またはあなたが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

@Nicklas Kevin Frank

解決策がうまくいかなかった。少なくとも完全にはそうではありませんが、あなたはいくつかの面で正しいのです。私は周りに手を加え、およびクエリは、このより良いように働いたことを発見:

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

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

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

だから、あなたが言ったように、それはdiffidently必要 - >最初の()のオプションを、それが(「ポスト」で必要はありませんでした)部分。しかし、私の友人に感謝します。私はあなたなしでこれを解決できなかった。