雄辩 - 渴望加载关系

时间:2016-12-15 09:40:46

标签: php laravel eloquent

我正在试图弄清楚如何从相关表中加载数据。我有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()

这可能与Eloquent有关吗?

3 个答案:

答案 0 :(得分:6)

你不应该直接加载关系。您可以始终在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

答案 1 :(得分: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

答案 2 :(得分:1)

在直接访问名字之前,您必须先访问该用户。

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

你写它的方式意味着消息有一个名字。