2016-12-15 56 views
2

我想弄清楚如何從相關表格中加載數據。我有2個型號GroupGroupTextPost雄辯 - 渴望加載關係

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() 

這是可能與言語有關嗎?

+1

嘗試'''$ M = $組 - >消息() - >獲得();'''然後'''$ m [0] - >用戶[0] - >名字;''' – 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模型建立新的關係:

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

加載兩個關係:

$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

如果它是'''with'''子句,並且消息和組之間有一個hasMany關係,那麼我認爲返回的消息將具有用戶集合,而不是單個對象。 – Dev

1

你必須直接訪問名字前訪問用戶。你寫這意味着消息有一個姓

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

的方式。