我必须说我的代码工作正常,但我不明白为什么......我想为不同的“模块”添加一些自定义字段。
例如我有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分钟来解释我,我们将不胜感激。
提前致谢。
答案 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;
}