laravel5填坑-多态关联的类型字段使用integer


image.png

当我们在Laravel中使用多态关联,想自定义多态的类型字段时,文档是这么教我们的:

自定义多态关联的类型字段#

默认,Laravel 会使用完全限定类名作为关联模型保存在多态模型上的类型字段值。比如,在上面的例子中,Comment属于 Post 或者 Video,那么 commentable_type的默认值对应地就是 App\Post 和 App\Video。但是,您可能希望将数据库与程序内部结构解耦。那样的话,你可以定义一个「多态映射表」来指示 Eloquent 使用每个模型自定义类型字段名而不是类名:

use Illuminate\Database\Eloquent\Relations\Relation;
Relation::morphMap([
    'posts' => 'App\Post']);

然而,当我使用整形integer作为类型时,

Relation::morphMap([
    1 => 'App\Post']);

却报了这样的错误

Class name must be a valid object or a string

尴尬,没法用了,折腾了下,看看源代码,发现了morphMap有第二个参数merge,默认为true

protected static $morphMap = [];

/**
 * Set or get the morph map for polymorphic relations.
 *
 * @param  array|null  $map
 * @param  bool  $merge
 * @return array
 */
public static function morphMap(array $map = null, $merge = true)
{
    $map = static::buildMorphMapFromModels($map);

    if (is_array($map)) {
        static::$morphMap = $merge ? c(static::$morphMap, $map) : $map;
    }

    return static::$morphMap;
}

打印static::$morphMap却发现"App\Post"下标为0

array(1) {
  [0]=>
  string(22) "App\Post"
}

原来是使用了array_merge()函数的原因,合并后会重建索引 ,static::$morphMap就变成了上面的值,不是我们想要的,只要把第二个参数设置为false即可。

折腾永无止境……


本文 暂无 评论

Top