如何投射雄辩的透视参数?

2022-08-30 14:47:21

我有以下有关系的雄辩模型:

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');
    }
}

数据透视表包含一个附加参数 (),该参数将关系标记为主关系。目前,我在查询联系人时看到如下返回:is_primary

{
    "id": 565,
    "leads": [
        {
            "id": 349,
             "pivot": {
                "contact_id": "565",
                "lead_id": "349",
                "is_primary": "0"
             }
        }
    ]
}

有没有办法将其中的转换为布尔值?我尝试将其添加到两个模型的数组中,但这并没有改变任何东西。is_primary$casts


答案 1

Laravel 5.4.14 中,此问题已得到解决。您可以定义自定义透视模型,并告诉您的关系在定义时使用此自定义模型。请参阅标题“定义自定义中间表模型”的文档

为此,您需要创建一个类来表示数据透视表,并让它扩展该类。在此类上,您可以定义属性。Illuminate\Database\Eloquent\Relations\Pivot$casts

<?php

namespace App;

use Illuminate\Database\Eloquent\Relations\Pivot;

class CustomPivot extends Pivot
{
    protected $casts = [
        'is_primary' => 'boolean'
    ];
}

然后,您可以使用关系上的方法告诉 Laravel 您希望透视使用指定的自定义透视模型。usingBelongsToMany

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Lead extends Model
{
    public function contacts()
    {
        return $this->belongsToMany('App\Contact')->using('App\CustomPivot');
    }
}

现在,每当您使用 访问数据透视时,您都应该发现它是自定义透视表类的实例,并且应该遵守该属性。->pivot$casts


2017年6月1日更新

@cdwyer的评论中提出的关于使用通常的//方法更新数据透视表的问题预计将在下个月(2017年7月)发布的Laravel 5.5中得到解决。syncattachsave

请参阅此错误报告底部的 Taylor 评论和他的提交,修复此处的问题。


答案 2

由于这是数据透视表上的属性,因此在 或 模型上使用该属性都不起作用。$castsLeadContact

但是,您可以尝试的一件事是使用定义了属性的自定义模型。有关自定义透视模型的文档,请参阅此处。基本上,您可以使用自定义项创建一个新模型,然后更新 和 模型以使用此自定义模型而不是基本模型。Pivot$castsPivotLeadContactPivot

首先,创建扩展基本模型的自定义模型:PivotPivot

<?php namespace App;

use Illuminate\Database\Eloquent\Relations\Pivot;

class PrimaryPivot extends Pivot {
    protected $casts = ['is_primary' => 'boolean'];
}

现在,重写 和 模型上的方法:newPivot()LeadContact

class Lead extends Model {
    public function newPivot(Model $parent, array $attributes, $table, $exists) {
        return new \App\PrimaryPivot($parent, $attributes, $table, $exists);
    }
}

class Contact extends Model {
    public function newPivot(Model $parent, array $attributes, $table, $exists) {
        return new \App\PrimaryPivot($parent, $attributes, $table, $exists);
    }
}

推荐