我的多态关系的解释
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;
}
我不得不说我的代码工作正常,但我不明白为什么...我想为不同的 "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;
}