我的多态关系的解释

Explanation for my polymorphic relationship

我不得不说我的代码工作正常,但我不明白为什么...我想为不同的 "modules" 添加一些自定义字段。

例如我有 3 个 table:摄像头、服务器和 custom_fields。

相机和服务器型号:

public function custom_fields()
{
    return $this->morphToMany('App\Models\Camera', 'item', 'description_fields', '', 'name')
        ->withPivot('name', 'value')
        ->withTimestamps();
}

此关系的 table :

Schema::create('description_fields', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('item_id')->unsigned();
    $table->string('item_type');
    $table->string('name');
    $table->string('value');
    $table->timestamps();
});

我可以通过控制器中的这一行添加一些元素:

$camera->custom_fields()->attach($request->custom_field);

我的问题是关于模型的,为什么我要写:

morphToMany('App\Models\Camera', 'item', 'description_fields', '', 'name')

我不明白为什么我必须指定最后 2 个参数:'','name'(将 'name' 更改为 'value' 并且可以正常工作,但如果我删除 '' ','name' 它不起作用)。

我已经阅读了参数的文档,但我仍然不明白(我不是专业开发人员,但我自己学习)。如果有人能花 5 分钟向我解释,将不胜感激。

提前致谢。

看看 Laravel 的 morphToMany 方法的源代码:

/**
 * Define a polymorphic many-to-many relationship.
 *
 * @param  string  $related
 * @param  string  $name
 * @param  string  $table
 * @param  string  $foreignKey
 * @param  string  $relatedKey
 * @param  bool  $inverse
 * @return \Illuminate\Database\Eloquent\Relations\MorphToMany
 */
public function morphToMany($related, $name, $table = null, $foreignKey = null, $relatedKey = null, $inverse = false)
{
    $caller = $this->guessBelongsToManyRelation();

    // First, we will need to determine the foreign key and "other key" for the
    // relationship. Once we have determined the keys we will make the query
    // instances, as well as the relationship instances we need for these.
    $instance = $this->newRelatedInstance($related);

    $foreignKey = $foreignKey ?: $name.'_id';

    $relatedKey = $relatedKey ?: $instance->getForeignKey();

    // Now we're ready to create a new query builder for this related model and
    // the relationship instances for this relation. This relations will set
    // appropriate query constraints then entirely manages the hydrations.
    $table = $table ?: Str::plural($name);

    return new MorphToMany(
        $instance->newQuery(), $this, $name, $table,
        $foreignKey, $relatedKey, $caller, $inverse
    );
}

您正在将 $foreignKey 设置为“”,将 $relatedKey 设置为 'name'。具体看这部分:

$relatedKey = $relatedKey ?: $instance->getForeignKey();

基本上这就是说,如果你给我一个 $relatedKey 使用它,否则从模型实例中获取它。

如果您转至 Model.php 查看 getForeignKey 方法的源代码,您将看到 class 名称 + '_' + 默认主键( 'id')。所以这导致 'camera_id'.

/**
 * Get the default foreign key name for the model.
 *
 * @return string
 */
public function getForeignKey()
{
    return Str::snake(class_basename($this)).'_'.$this->primaryKey;
}