我正在试图弄清楚如何从相关表中加载数据。我有2个模型Group
和GroupTextPost
。
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有关吗?
答案 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;
你写它的方式意味着消息有一个名字。