Laravel Polymorphic Relations:约束违规:关键'images_imageable_id_unique的重复条目

时间:2018-03-14 15:13:51

标签: laravel polymorphic-associations laravel-eloquent

我正在构建一个包含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');

    }

1 个答案:

答案 0 :(得分:2)

  

但是“imageable_id”也必须是独一无二的。

多态关系不可能是唯一的。如果你想使用多态关系,它实际上不可能是唯一的,因为多态关系连接到多个表,并且每个表都有自己的自动增量id,它们在各自的表上是唯一的,但在数据库中不是唯一的。

It's possible在多个表中包含唯一ID,但在MySQL中却不常见。

解决方案是从unique表上的imageable_id列中删除images索引。

您可能希望imagaeble_idimageable_type的组合是唯一的,这将实现一对一的关系,can be done在MySQL级别上。