Laravel 中的一对一关系总是需要 first() 吗?

我在 User 和 UserSettings 模型之间存在一对一的关系,

但是(之后$user = auth()->user())当我尝试$user->settings()->something它时会引发Undefined property错误。

用的时候就没了$user->settings()->first()->something...

我的问题是,这是它应该如何工作的吗?还是我做错了什么?


largeQ
浏览 130回答 4
4回答

守候你守候我

此代码将为您提供收集结果。$user->settings;所以调用“某事”是不可用的,否则它将返回 null,除非你得到它的特定索引。$user->settings()->something而这个之所以有效,是因为您使用 first() 获取了集合的第一个数据并访问了它的属性。$user->settings()->first()->something第一个方法返回集合中通过给定真值测试的第一个元素,请参阅此处的文档 laravel docs

慕少森

如果您想获取用户settings本身,只需执行以下操作:$user->settings然后,您可以获得设置的字段:$user->settings->something执行此$user->settings()操作后,您可以链接查询。例如$user->settings()->where('something', 'hello')->first()这就是为什么 和 的输出$user->settings是$user->settings()->first()相同的。

达令说

Auth 只为您提供用户信息;试试下面的代码:$user = User::find(auth()->user()->id);//and then $user->settings->something;

慕斯709654

您不能直接运行$user->settings()->something.因为当您调用时$user->settings(),它只返回Illuminate\Database\Eloquent\Relations\HasOne对象。所以它不是模型的对象,你需要获取模型的对象并像这样调用它的属性。$user->settings()->first()->something;动态属性User由于您在和之间具有一对一的关系UserSettings。如果您的用户模型中有一对一的关系:public function settings(){   return $this->hasOne('App\Models\UserSettings', 'user_id', 'id');}根据Laravel 文档一旦定义了关系,我们就可以使用 Eloquent 的动态属性来检索相关记录。动态属性允许您访问关系方法,就好像它们是在模型上定义的属性一样:Eloquent 会自动为你加载关系,甚至可以知道是调用 get(对于一对多关系)还是 first(对于一对一关系)方法。然后可以通过与关系同名的动态属性访问它。所以你可以像这样使用 eloquent 的动态属性:$user->settings->something; // settings is the dynamic property of $user.
打开App,查看更多内容
随时随地看视频慕课网APP