php - 如何转换 Eloquent Pivot 参数?

标签 php laravel laravel-5 eloquent

我有以下具有关系的 Eloquent 模型:

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 转换为 bool 值?我已经尝试将它添加到两个模型的 $casts 数组中,但这并没有改变任何东西。

最佳答案

Laravel 5.4.14 中,这个问题已经解决。您可以定义自定义数据透视模型,并告诉您的关系在定义时使用此自定义模型。参见 the documentation ,在 Defining Custom Intermediate Table Models 标题下。

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

<?php

namespace App;

use Illuminate\Database\Eloquent\Relations\Pivot;

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

然后您可以在 BelongsToMany 关系上使用 using 方法来告诉 Laravel 您希望您的数据透视表使用指定的自定义数据透视表模型。

<?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 在评论中提出的关于使用通常的 sync/attach/save 方法更新数据透视表的问题预计会将在下个月(2017 年 7 月)发布的 Laravel 5.5 中修复。

请参阅 this bug report 底部的 Taylor 评论和他的 promise ,解决了这个问题 here .

关于php - 如何转换 Eloquent Pivot 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30226496/

相关文章:

php - 数据列表在下拉列表中的空格后未显示完整名称

php - mysql_real_escape_string() 说用户访问被拒绝 'drrifae' @'localhost'

php - laravel 在验证 FormRequest 后返回错误而不是重定向的 json

mysql - 如何在 "Foreign key constraint is incorrectly formed"时修复错误 'php artisan migrate'?

php - 如何在linux平台上使用laravel 5和sqlserver?

php - PHP-帮助警告: Missing argument

php - MySQL、PHP 使用 LIKE 语法?

mysql - 无法将数据库连接到 AWS

php - Laravel 密码重置不起作用

php - 如何在 Laravel 5.5 中包含外部 CSS 和 JS 文件