Laravel外键完整性约束违规

时间:2016-05-20 11:06:55

标签: php database laravel foreign-keys foreign-key-relationship

我的数据库中有一个名为images的外键。

这是它的迁移:

class CreateImagesTable extends Migration
{

    public function up()
    {
        Schema::create('images', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('product_id')->unsigned();
            $table->integer('product_r_id')->unsigned();
            $table->string('name', 50);
            $table->text('images', 50);
            $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade')->onUpdate('cascade');
            $table->timestamps();
        });

        Schema::table('images', function (Blueprint $table) {
            $table->foreign('product_r_id')->references('id')->on('products_r')->onDelete('cascade')->onUpdate('cascade');
        });
    }

    public function down()
    {
        Schema::drop('images');
    }

}

它的模型看起来像这样:

class Images extends Model
{
    protected $table = 'images';

    protected $fillable = ['product_id', 'product_r_id', 'name', 'images'];

    public function product()
    {
        return $this->belongsTo('App\Product', 'product_id');
    }

    public function productR()
    {
        return $this->belongsTo('App\ProductR', 'product_r_id');
    }

}

ProductR Model看起来像这样:

class ProductR extends Model
{
    protected $table = 'products_r';

    protected $fillable = ['email', 'title', 'filename', 'inputMpg', 'number_of_chapters'];

    public function images()
    {
        return $this->hasMany('App\Images');
    }

}

和这样的产品型号:

class Product extends Model
{
    protected $table = 'products';

    protected $fillable = ['email', 'title', 'filename', 'inputMpg', 'number_of_chapters'];

    public function scenesImages()
    {
        return $this->hasMany('App\Images');
    }
}

所以我基本上尝试将两种不同形式的不同产品与其图像保存在我的数据库(图像)中的同一个表中。

运行我的程序会返回以下错误:

  

Connection.php第655行中的QueryException:SQLSTATE [23000]:完整性   约束违规:1452无法添加或更新子行:异类   键约束失败(mydbimages,CONSTRAINT   images_product_id_foreign FOREIGN KEY(product_id)参考   productsid)ON DELETE CASCADE ON UPDATE CASCADE)(SQL:insert   进入imagesnameimagesproduct_r_idupdated_at,   created_at)值(ki,0Chrysanthemum.jpg,10,2016-05-20 10:50:51,   2016-05-20 10:50:51))

1 个答案:

答案 0 :(得分:1)

我认为问题出现的原因是:

$table->integer('product_id')->unsigned();
[...]
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade')->onUpdate('cascade');

你不能只是在没有填写product_id的情况下创建图像,因为错误

似乎是这种情况
insert into images (name, images, product_r_id, updated_at, created_at) ...

表示您正在插入images而没有product_id且不能为空且具有外键约束。

我想你可以做一个

$table->integer('product_id')->unsigned()->nullable();

所以你不需要在插入时分配它。