首页 文章

雄辩 - 渴望加载关系

提问于
浏览
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()

这可能与Eloquent有关吗?

3 回答

  • 1

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

    您必须在直接访问名字之前访问该用户 .

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

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

  • 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

相关问题