doubi7739 2016-02-19 21:01
浏览 94
已采纳

SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:Laravel 5中的外键约束失败

I'm new to laravel and web application development.

I'm developing a project with laravel 5 to have a little problem linking tables, trying to create a product and upload an image generates the following error:

QueryException in Connection.php line 624: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (inventario.uploads, CONSTRAINT uploads_product_id_foreign FOREIGN KEY (product_id) REFERENCES products (id) ON DELETE CASCADE) (SQL: insert into uploads (image) values (56c7846619fdb.jpg))

This is the ProductController

<?php namespace App\Http\Controllers\Admin;

use App\Http\Requests;
use App\Http\Requests\SaveProductRequest;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Product;
use App\Category;
use App\Upload;

class ProductController extends Controller {

public function store(SaveProductRequest $request)
    {
        $data = [
            'name'          => $request->get('name'),
            'slug'          => str_slug($request->get('name')),
            'description'   => $request->get('description'),
            'extract'       => $request->get('extract'),
            'price'         => $request->get('price'),
            'quantity'      => $request->get('quantity'),
            'image'         => $request->get('image'),
            'visible'       => $request->has('visible') ? 1 : 0,
            'category_id'   => $request->get('category_id'),
            'provider_id'   => $request->get('provider_id')
        ];

        $product = Product::create($data);

        $data = \Input::file('file')->getMimeType();
        $extension = strtolower(\Input::file('file')->getClientOriginalExtension());
        $image = uniqid().'.'.$extension;
        $path = "images";

        switch ($data)
        {
            case "image/jpeg":
            case "image/png":
            case "image/gif":
            case "application/pdf":
                if (\Request::file('file')->isValid())
                {
                    \Request::file('file')->move($path, $image);
                    $upload = new Upload();
                    $upload->image = $image;
                    $upload->save();
                }
            break;
            default:
        }    

        $message = $product ? 'Producto agregado correctamente!' : 'El producto NO pudo agregarse!';

        return redirect()->route('product.index')->with('message', $message);
    }
}

The Product Model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

    protected $fillable = ['name', 'slug', 'description', 'extract', 'price', 'quantity', 'visible', 'category_id'];


    // Relation with Category
    public function category()
    {
        return $this->belongsTo('App\Category');
    }

    public function upload()
    {
        return $this->belongsTo('App\Upload');
    }

    //Query para buscador
    public function scopeName($query, $name)
    {
        //dd("scope: " . $name);
        $query->where(\DB::raw("CONCAT(name, '', description, '', price, '', quantity)"), "LIKE", "%$name%");
    }
}

Upload Model

<?php 

namespace App;

use Illuminate\Database\Eloquent\Model;

class Upload extends Model 
{

    public $timestamps = false;

    protected $table = 'uploads';

    protected $fillable = ['image', 'product_id'];

    protected $hidden = [];

    //Relación con productos
    public function products()
    {
        return $this->hasOne('App\Product');
    }

}

Upload Database Migration

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUploadsTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('uploads', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('image', 300);
            $table->integer('product_id')->unsigned();
            $table->foreign('product_id')
                  ->references('id')
                  ->on('products')
                  ->onDelete('cascade');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('uploads');
    }

}

Products Database Migration

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateProductsTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('name', 255);
            $table->string('slug');
            $table->text('description');
            $table->string('extract', 300);
            $table->decimal('price', 8, 2);
            $table->string('quantity', 300);        
            $table->boolean('visible');
            $table->integer('category_id')->unsigned();
            $table->foreign('category_id')
                  ->references('id')
                  ->on('categories')
                  ->onDelete('cascade');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('products');
    }

}

Thank someone who can guide me.

  • 写回答

1条回答 默认 最新

  • dqmnueuu459279 2016-02-19 22:43
    关注

    Looking up your code you're trying to save the Upload model without setting a relationship with the parent model (actually the Product model). For saving your Upload setting up the relationship with the Product, do something like this:

    $product->upload()->save($upload);
    

    instead of

    $upload->save();
    

    You'll keep up the constraint between the uploads table's foreign key (product_id) and the parent table (products)

    Just an advice: when working with multiple insert/upload queries on related data, consider the use of the DB:transaction method for performing your queries in a proper transaction.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3