首页 > 解决方案 > Laravel 5.8 - 无法使用 Laravel 添加或更新子行

问题描述

我有一个包含多个数据的简单表,如下所示:

页表

在此处输入图像描述

我创建了一个与这样命名的表的关系prebids

public function up()
{
    Schema::create('prebids', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('bidder_name');
        $table->string('params_name');
        $table->string('params_value');
        $table->bigInteger('page_id')->unsigned();
        $table->foreign('page_id')->references('id')->on('pages')->onDelete('cascade');
        $table->timestamps();
    });
}

这是页面模型:

class Page extends Model
{
    protected $fillable = [
        "title",
        "articles",
        "status"
    ];

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

这是预投标模型:

class Prebid extends Model
{
    protected $fillable = [
        "params_name",
        "params_value",
        "bidder_name"
    ];
    public function page()
    {
        return $this->belongsTo('App\Page');
    }
}

现在,当用户单击添加预投标时,我想根据模型存储预投标数据。

所以在pages index.blade.php添加按钮上我有这个

<td>
    <a href="{{ route('prebids.create'), $page->id}}"
       class="btn btn-sm btn-primary">Add prebid</a>

prebid controller有以下内容:

class PrebidController extends Controller
{

    public function create()
    {
        $prebid = Prebid::all();
        $page = Page::all();

        return view('prebids.create', ['page' => $page]);
    }

    public function store(Request $request)
    {
        foreach ($request->input() as $parameters) {
            $parameters = new prebid();
            $parameters->save();
        }
        return redirect("/pages")->with("sucess", "data successfully saved");
    }

}

现在,当用户单击添加预出价时,它会打开一个表单,用户可以在其中添加信息并提交,当我提交时,我收到以下错误

SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败(royaladprebids,CONSTRAINT prebids_page_id_foreignFOREIGN KEY(page_id)REFERENCES pagesid)ON DELETE CASCADE)(SQL:插入prebidsupdated_atcreated_at)值(2019- 11-06 15:24:34, 2019-11-06 15:24:34))

我的代码有什么问题?

标签: phpmysqllaravellaravel-blade

解决方案


在保存之前,您需要将页面与模型关联:

$parameters = new prebid();
$parameters->page()->associate( $theActualPageObject )
$parameters->save();

否则,表page_id中的列prebid将为空,这是不允许的,因为您设置了与pages.id那里的关系 - 因此外键约束错误。

如果您不总是有一个页面,您还可以将其page_id nullable设置为并将其默认为null

$table->bigInteger('page_id')->unsigned()->nullable()->default(null);

推荐阅读