我有以下几个有关系的口才模型:
class Lead extends Model
{
public function contacts()
{
return $this->belongsToMany('App\Contact')
->withPivot('is_primary');
}
}
class Contact extends Model
{
public function leads()
{
return $this->belongsToMany('App\Lead')
->withPivot('is_primary');
}
}
字符串
pivot表包含一个额外的参数(is_primary
),它将关系标记为主要关系。目前,当我查询联系人时,我看到这样的返回:
{
"id": 565,
"leads": [
{
"id": 349,
"pivot": {
"contact_id": "565",
"lead_id": "349",
"is_primary": "0"
}
}
]
}
型
有没有办法将is_primary
转换为布尔值?我试着将它添加到两个模型的$casts
数组中,但没有任何改变。
6条答案
按热度按时间qnyhuwrf1#
在Laravel 5.4.14中,此问题已得到解决。您可以定义自定义透视表模型,并在定义关系时告诉关系使用此自定义模型。请参阅文档,标题为 * 定义自定义中间表模型 *。
要做到这一点,你需要创建一个类来表示你的数据透视表,并让它扩展
Illuminate\Database\Eloquent\Relations\Pivot
类。在这个类上,你可以定义你的$casts
属性。字符串
然后,您可以在
BelongsToMany
关系上使用using
方法来告诉Laravel您希望您的pivot使用指定的自定义pivot模型。型
现在,每当您使用
->pivot
访问pivot时,您应该会发现它是自定义pivot类的示例,并且$casts
属性应该被接受。更新2017年6月1日
@cdwyer在评论中提出的关于使用通常的
sync
/attach
/save
方法更新pivot表的问题预计将在下个月(2017年7月)发布的Laravel 5.5中得到修复。请参阅Taylor在this bug report底部的评论和他的提交,修复了here问题。
mbjcgjjk2#
由于这是数据透视表上的一个属性,所以使用
$casts
属性在Lead
或Contact
模型上都不起作用。但是,您可以尝试的一件事是使用定义了
$casts
属性的自定义Pivot
模型。有关自定义pivot模型的文档在这里。基本上,您使用自定义创建了一个新的Pivot
模型,然后更新Lead
和Contact
模型以使用此自定义Pivot
模型而不是基本模型。首先,创建您的自定义
Pivot
模型,它扩展了基础Pivot
模型:字符串
现在,在
Lead
和Contact
模型上覆盖newPivot()
方法:型
1u4esq0p3#
好消息!Tylor已经修复了这个bug:
https://github.com/laravel/framework/issues/10533
在Laravel 5.1或更高版本中,您可以使用点表示法进行枢轴转换:
字符串
llycmphe4#
上面@patricus提供的答案是绝对正确的,但是,如果你像我一样也想从数据透视表中的JSON编码字符串中获得好处,那么请继续阅读。
问题
我相信Laravel在这个阶段有一个bug。问题是当你示例化一个pivot模型时,它使用原生的Illuminate-Model
setAttributes
方法来“复制”pivot记录表的值到pivot模型。这对于大多数属性来说都很好,但是当它看到
$casts
数组包含JSON风格的强制转换时就会变得棘手-它实际上对数据进行了双重编码。解决方案
我克服这个问题的方法如下:
1.建立你自己的Pivot基类,从它扩展你的Pivot子类(稍后会有更多的介绍)
2.在新的Pivot基类中,重新定义
setAttribute
方法,注解掉处理JSON可铸造属性的行字符串
这突出显示了
isJsonCastable
方法调用的删除,它将为您在出色的pivot子类中转换为json
、array
、object
或collection
的任何属性返回true
。3.使用某种有用的命名约定创建pivot子类(我使用
{PivotTable}Pivot
,例如,pivotureProductPivot)4.在你的基础模型类中,修改/创建你的
newPivot
方法覆盖到一些更有用的东西我的看起来像这样:
型
然后确保你的模型是从你的基本模型扩展的,你创建了你的数据透视表“模型”来适应你的命名约定,瞧,你将在离开数据库的路上对数据透视表列进行JSON转换!
注意:这还没有经过彻底的测试,保存回数据库可能会有问题。
dgtucam15#
我不得不添加一些额外的检查,以使保存和加载功能在Laravel 5中正常工作。
字符串
rmbxnbpk6#
更简单的方法是在pivot关系函数上标记
withCasts
:字符串