Laravel属于关系

Wal*_*lcz 7 php eloquent laravel-4

好吧,我对模特的belongsTo关系有点困惑.

我有一个扩展Eloguent的Feeds模型.

我创建了一个名为User的关系函数.

public function user(){
  return $this->belongsTo('User'); // and I also tried return $this->belongsTo('User', 'user_id');
}
Run Code Online (Sandbox Code Playgroud)

在我想要做的观点上:

@foreach($feeds as $feed)
{{$feed->user()->first_name}} {{$feed->user()->last_name}}
@endforeach
Run Code Online (Sandbox Code Playgroud)

但我收到此错误未定义属性:Illuminate\Database\Eloquent\Relations\BelongsTo :: $ last_name

当我执行$ feed-> user-> first_name时它工作正常,但我认为user() - > first_name更有效.我究竟做错了什么?

这是数据库的字段和数据类型:

供稿

feed_id INT
user_id INT
feed Text
created_at TIMESTAMP
updated_at TIMSTAMP
school_id INT
Run Code Online (Sandbox Code Playgroud)

用户

user_id INT
username VARCHAR
password VARCHAR
first_name VARCHAR
last_name VARCHAR
created_at TIMESTAMP
updated_at TIMESTAMP
Run Code Online (Sandbox Code Playgroud)

Hai*_*ood 19

使用动态属性

$feed->user->first_name;
Run Code Online (Sandbox Code Playgroud)

当您使用动态属性时,它与执行以下操作相同,只不过Laravel使用魔术__call()方法为您执行此操作.

$feed->user()->first()->first_name;
Run Code Online (Sandbox Code Playgroud)

仅使用函数$ feed-> user()允许您获得允许您with在另一端获取实体之前添加额外约束和关系的关系.

  • $ feed-> user-> someProperty本身不会导致N + 1问题.N + 1问题是在循环中调用这样的代码,例如.foreach($ feed as $ feed).对于单个$ feed,这不是问题,但对于集合,您应该使用预先加载. (2认同)
  • 当您使用提取您的提要时,例如`Feeds :: with('user') - > ...`,它将获取同一查询中的所有用户信息. (2认同)
  • 当你使用`with(...)`和动态属性时,你仍然需要使用`$ feed-> user-> first_name`,它将从返回的结果中获取用户(它同时获取)而不是询问数据库. (2认同)