我的多态关系的解释

时间:2017-10-14 21:07:03

标签: laravel eloquent polymorphism relation

我必须说我的代码工作正常,但我不明白为什么......我想为不同的“模块”添加一些自定义字段。

例如我有3个表:Cameras,Servers和custom_fields。

相机&服务器型号:

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

此关系的表格:

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

我不明白为什么我必须指定最后两个参数:'','name'(将'name'改为'value'并且它正在工作,但是如果我删除'','name'它就不会'工作)。

我已经读过params的文档,但我仍然不明白(我不是专业的开发者,但我自己学习)。如果有人可以花5分钟来解释我,我们将不胜感激。

提前致谢。

1 个答案:

答案 0 :(得分:1)

看看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方法的源代码,你会看到这个结果是类名+'_'和默认主键('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;
}