2016-12-15 21 views
2

私は、関連するテーブルからデータを読み込む方法を理解しようとしています。私はGroupGroupTextPostの2つのモデルを持っています。Eloquent - Eager Loading Relationship

Group.php

<?php 

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 

class Group extends Model 
{ 
    protected $table = 'group'; 

    public function type() 
    { 
     return $this->hasOne('\App\Models\GroupType'); 
    } 

    public function user() 
    { 
     return $this->belongsTo('\App\Models\User'); 
    } 

    public function messages() 
    { 
     return $this->hasMany('\App\Models\GroupTextPost'); 
    } 
} 

グループのテキスト記事をフェッチするとき、私は何をしようとしているGroupTextPost.php

<?php 

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 

class GroupTextPost extends Model 
{ 
    protected $table = 'group_text_post'; 

    public function user() 
    { 
     return $this->belongsTo('\App\Models\User'); 
    } 

    public function group() 
    { 
     return $this->belongsTo('\App\Models\Group'); 
    } 
} 

user熱心な負荷である私が引っ張ったときになるようにユーザーの名前が含まれるメッセージ

私はそうのようにそれをやってみました:

public function messages() 
{ 
    return $this->hasMany('\App\Models\GroupTextPost')->with('user'); 
} 

...などのように呼び出す:

$group = Group::find($groupID); 
$group->messages[0]->firstname 

しかし、私はエラーを取得する:

Unhandled Exception: Call to undefined method Illuminate\Database\Query\Builder::firstname() 

はこれですEloquentと関係がありますか?

+1

てみ '' '$ M = $基 - >メッセージを使用することができます - >()を取得し、次に' ''と'' '$ m [0] - > user [0] - > first_name;' '' – Dev

+0

メッセージはファーストネームかユーザーが持っていますか? – Dev

+0

@Devユーザーはファーストネームを持っています。 – BugHunterUK

答えて

3

リレーションシップに直接負荷をかけないでください。ユーザーは常にGroupTextPostモデルに負荷をかけることができます。

GroupTextPost.php

<?php 

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 

class GroupTextPost extends Model 
{ 
    protected $table = 'group_text_post'; 

    /** 
    * The relations to eager load on every query. 
    * 
    * @var array 
    */ 
    protected $with = ['user']; 

    public function user() 
    { 
     return $this->belongsTo('\App\Models\User'); 
    } 

    public function group() 
    { 
     return $this->belongsTo('\App\Models\Group'); 
    } 
} 

それとも、()Nested Eager Loading

$group = Group::with(['messages.user'])->find($groupID); 
$group->messages[0]->user->firstname 
+0

'$ with'プロパティについて知りませんでした。これは文書のどこにありますか?それは理想的ですね。 – BugHunterUK

+0

私はドキュメントの中で見つけることができません。 Modelクラスで見つけることができます。 [この行を見る](https://github.com/laravel/framework/blob/3b7181e728d27a641e953ac22e93d91f87e46888/src/Illuminate/Database/Eloquent/Model.php#L182) –

1

Messageモデルにおける新たな関係を作成します。

$group = Group::with('messages', 'messages.user')->find($groupID); 

foreach ($group->messages as $message) { 
    $message->user->firstname; 
} 

https://laravel.com/docs/5.3/eloquent-relationships#eager-loading

+0

'' '' '' '節で、メッセージとグループの間にhasMany関係がある場合、返されたメッセージには単一のオブジェクトではなく、ユーザーのコレクションがあると思います。 – Dev

1

あなたが直接FIRSTNAMEにアクセスする前に、ユーザーにアクセスする必要があります。両方の関係が

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

ロードを。

$group->messages[0]->user->firstname;

あなたがそれを書いた方法は、メッセージがFIRSTNAMEを有することを意味します。

関連する問題