我正在构建一个包含4个表的应用程序:电影,演员,类别和图像 一侧的图像与另一侧的胶片,演员和类别之间存在多晶型关系。
这些是我的模特:
- Actor
class Actor extends Model
{
protected $fillable = ['name', 'image_id', 'genre', 'slug',];
public function images()
{
return $this->morphMany('App\Comment', 'imageable');
}
}
- Category
class Category extends Model
{
protected $fillable = [ 'category', 'description', 'image_id', 'slug'];
public function images()
{
return $this->morphMany('App\Comment', 'imageable');
}
}
- Film
class Film extends Model
{
protected $fillable = ['name','image_id','description','slug','trailer','year','duration','age_id','language_id','category_id'];
public function images()
{
return $this->morphMany('App\Comment', 'imageable');
}
}
- Images
class Image extends Model
{
protected $fillable = [ 'image', 'imageable_id', 'imageable_type' ];
public function imageable()
{
return $this->morphTo();.
}
}
据我所知,Images表中的“imageable_id”是其他表中位置的id(INCREMENT)(film-> id,category-> id或actor-> id)
但是“imageable_id”也必须是独一无二的。
这是我的问题:
假设我制作了第一部电影并将图像与之关联起来。
Image.id = 1, imageable_id = 1 (the id of the film), imageable_type = film
其次,我创建了一个actor并将图像与之关联。
Image.id = 2, imageable_id = 1 (the id of the actor).... <-- ERROR
SQLSTATE [23000]:完整性约束违规:1062关键字'images_imageable_id_unique 重复输入“7”
我应该删除所有表格中的AUTO_INCREMENT吗?
关于如何解决这个问题的任何想法?
我的3个控制器(CategoriesController,FilmsControllers和ActorControllers)中的Store方法是类似的。 (我在这里只分享分类控制器)
public function store(CategoriesRequest $request)
{
$file = $request->file('image');
$name = time() . '-' . $file->getClientOriginalName();
$file->move('images', $name);
$last_img = Image::orderBy('id', 'desc')->first();
$category = Category::create([
'category' => $request->category,
'description' => $request->description,
'slug' => str_slug($request->category, '-'),
'image_id' => $last_img->id + 1,
]);
$image = Image::create([
'image' => $name,
'imageable_type' => 'Category',
'imageable_id' => $category->id
]);
$category->save();
Session::flash('success', 'Category successfully created!');
return redirect()->route('categories.index');
}
答案 0 :(得分:2)
但是“imageable_id”也必须是独一无二的。
多态关系不可能是唯一的。如果你想使用多态关系,它实际上不可能是唯一的,因为多态关系连接到多个表,并且每个表都有自己的自动增量id,它们在各自的表上是唯一的,但在数据库中不是唯一的。
It's possible在多个表中包含唯一ID,但在MySQL中却不常见。
解决方案是从unique
表上的imageable_id
列中删除images
索引。
您可能希望imagaeble_id
和imageable_type
的组合是唯一的,这将实现一对一的关系,can be done在MySQL级别上。