Php Laravel中的一对一关系是否总是需要优先()?

Php Laravel中的一对一关系是否总是需要优先()?,php,laravel,Php,Laravel,我在用户和用户设置模型之间有一对一的关系 但是(在$user=auth()->user()之后)当我尝试$user->settings()->something时,它会抛出一个未定义的属性错误 当我使用$user->settings()->first()->something时,它就消失了 我的问题是,它应该是这样工作的吗?还是我做错了什么?此代码将为您提供收集结果 $user->settings; 因此调用“something”不可用,或者它将返回null,除非您获得它的特定索引 $u

我在用户和用户设置模型之间有一对一的关系

但是(在
$user=auth()->user()
之后)当我尝试
$user->settings()->something
时,它会抛出一个
未定义的属性
错误

当我使用
$user->settings()->first()->something
时,它就消失了


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

此代码将为您提供收集结果

$user->settings;
因此调用“something”不可用,或者它将返回null,除非您获得它的特定索引

$user->settings()->something
而这个方法之所以有效,是因为您使用first()获取了集合的第一个数据并访问了它的属性

$user->settings()->first()->something
第一个方法返回集合中通过给定真值测试的第一个元素
请参见此处的文档

您不能直接运行
$user->settings()->某些内容

因为当您调用
$user->settings()
时,它只返回对象

因此,它不是模型的对象,您需要获取模型的对象,并像这样调用其属性

$user->settings()->first()->something;

动态特性 因为
用户
用户设置
之间存在一对一的关系

如果用户模型中存在一对一关系:

公共功能设置()
{
返回$this->hasOne('App\Models\UserSettings','user\u id','id');
}

一旦定义了关系,我们就可以使用Eloquent的动态属性来检索相关记录。动态属性允许您访问关系方法,就像它们是在模型上定义的属性一样:

Eloquent将自动为您加载关系,甚至可以聪明地知道是调用get(对于一对多关系)还是first(对于一对一关系)方法。然后,可以通过与关系同名的动态属性访问它

所以你可以用这样的雄辩:

$user->settings->something;//设置是$user的动态属性。

Auth只提供用户信息

请尝试以下代码:

$user = User::find(auth()->user()->id);//and then 
$user->settings->something;

如果要获取用户
设置
本身,只需执行以下操作:

$user->settings
然后,您可以通过以下操作获取设置字段:

$user->settings->something

当您执行此操作时,
$user->settings()
您可以在此之后链接查询。例如

$user->settings()->where('something', 'hello')->first()

这就是为什么
$user->settings
$user->settings()->first()
的输出是相同的

您是否尝试过
$user->settings->something
您可以从您的用户那里分享您的settings()方法吗model@RonakDhoot非常感谢。使用
$user->settings->something
而不是
$user->settings()->something
修复了它!