雄辩 - 渴望加载关系
我想弄清楚如何从相关表格中加载数据。我有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()
这是可能与言语有关吗?
你不应该急于直接加载关系。您可以始终在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
我不知道'$ with'属性。文档在哪里?这看起来很理想。 – BugHunterUK
我在文档中找不到。你可以在Model类中找到它。 [看到这一行](https://github.com/laravel/framework/blob/3b7181e728d27a641e953ac22e93d91f87e46888/src/Illuminate/Database/Eloquent/Model.php#L182) –
在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
如果它是'''with'''子句,并且消息和组之间有一个hasMany关系,那么我认为返回的消息将具有用户集合,而不是单个对象。 – Dev
你必须直接访问名字前访问用户。你写这意味着消息有一个姓
$group->messages[0]->user->firstname;
的方式。
尝试'''$ M = $组 - >消息() - >获得();'''然后'''$ m [0] - >用户[0] - >名字;''' – Dev
邮件将有名字或用户有? – Dev
@Dev用户拥有名字。 – BugHunterUK