枢轴模型上的替代强制类型

时间:2019-07-12 12:34:04

标签: php laravel

我有以下型号:

Document.php

/**
 * Get all of the documents field content.
 *
 * @return Illuminate\Database\Eloquent\Model
 */
public function fields()
{
    return $this->morphToMany(Field::class, 'fieldable')
    ->using('App\FieldablePivot')
    ->withPivot(['content', 'type'])
    ->withTimestamps();
}

那是使用称为FieldablePivot的数据透视模型的,我需要在其中访问返回content列。

这是我的FieldablePivot,这里我覆盖了getCastType方法:

protected function getCastType($key)
{
    if ($key == 'content' && !empty($this->type)) {
        return $this->type;
    }
    return parent::getCastType($key);
}

下面是fieldables的行:

id | name          | content       | type    |
---------------------------------------------
1  | field_one     | [somearray]   | array   |
2  | field_two     | somestring    | string  |

但是,当我访问文档及其字段以获取字段内容时,例如:

@foreach ($document->fields as $field)
{{dd($field->pivot->content)}}
@endforeach

它将第一个作为字符串返回(即使类型是数组):

"[somearray]"

1 个答案:

答案 0 :(得分:1)

您还必须覆盖hasCast函数,以确保Eloquent知道此列有强制类型转换。

public function hasCast($key, $types = null)
{
    if ($key === 'content') {
        return true;
    }
    return parent::hasCast($key, $types);
}

如果不这样做,并且该字段不在$casts数组中,则Eloquent将不会检测到该属性具有强制类型转换。