我有两个表之间的关系,其中一个连接表只有一个结果。
当我定义Laravel belongsToMany关系时,我希望它只返回一个元素,而不是返回一个只有一个元素的集合。
有没有办法在Laravel中建模?
先谢谢你了。
[编辑]
我将尝试使用经典的用户/角色示例来解释我想要的内容。除了de users
和roles
表,我们还有一个users_roles
数据透视表,它将存储用户拥有的所有角色。在任何给定时间,用户只能有一个活动角色(由active
属性true
标识)。
class User {
function role() {
return $this->belongsToMany('App\Role')->wherePivot('active', 'true');
}
}
有了这个关系定义,当我访问$user->role
时,我会得到一个Roles集合(只有一个元素)。我想要的是直接拥有该角色示例。
6条答案
按热度按时间332nm8kg1#
在我的情况下,这是最直接的解决方案:
数据透视表类:
polhcujo2#
我不知道如果你只需要一个关系,为什么你有belongsToMany,但是下面的代码会帮助你:
或
hkmswyz63#
我遇到了这个问题,并找到了一个非常干净的方法来解决它。
首先,更改返回
belongsToMany
结果的访问器函数的名称,以反映这些返回多个结果的事实。在您的情况下,这意味着使用roles
而不是role
:然后将以下内容添加到模型中:
现在,当您调用
$user->role
时,您将获得第一项。lxkprmvk4#
我也遇到了同样的问题,让我向你展示我是如何做到的。
在我的例子中,材料和customer_types之间存在belongsToMany关系,数据透视表包含特定客户类型的材料价格,因此数据透视表中的记录(价格)与customer_types一样多。
我所期望的:当请求特定customer_type的价格时,我希望获得该特定customer_type的作用域价格作为嵌套元素。
**我得到的是:**一个只有1个元素的集合。
这是我在模型开始时所拥有的:
当然,当我为特定的customer_type请求customer_types时,结果并不是预期的结果:
它返回了一个Material模型,其中包含一个customer_types嵌套集合,其中包含1个元素,这迫使我使用first()或循环1个元素。
**解决方案:**创建一个扩展透视表的模型,并为其添加一个关系。
创建了一个扩展轴的新模型:
现在,在我的材质模型中添加指向此新模型的关系:
最后,加载这个新关系的查询:
结果是一个Material模型,其中嵌套了一个scoped_price元素,并通过customer_type_id进行过滤
我不确定这是不是正确的方法,但对我来说很有效。
希望有帮助!
rt4zxlrg5#
我已经写了一个更通用的方法来解决这个问题。它的缺点是我不得不从laravel/frame供应商文件中复制代码。因此,在升级Laravel框架时,这可能会被打破。
然后在你的模型中,只需要使用Trait并指定哪些关系是单一结果。
xxhby3vn6#
Laravel Eloquent基于魔术原理工作。您可以重写神奇的方法
__get
。如果没有属性,则调用__get
方法:(in您的模型)
如果
your_prop
to-many关系返回任何值,则取数组中的第一个。