在Eloquent

时间:2016-07-11 13:43:29

标签: laravel eloquent laravel-5.2

我刚刚开始玩,我想做的就是跟随查询在Eloquent 中工作

INSERT INTO geschichte (geschichte_id, 
                        geschichte_text1, 
                        geschichte_text2, 
                        geschichte_text3) 
VALUES (:geschichte_id, 
        :geschichte_text1, 
        :geschichte_text2, 
        :geschichte_text3) 
ON DUPLICATE KEY 
UPDATE geschichte_id = :geschichte_id, 
       geschichte_text1 = :geschichte_text1, 
       geschichte_text2 = :geschichte_text2, 
       geschichte_text3 = :geschichte_text3;

控制器功能

public function alterGeschichte(Request $request)
{
    $geschichte1 = new Geschichte;
    $geschichte2 = new Geschichte;
    $geschichte3 = new Geschichte;

    $geschichte1 = Geschichte::updateOrCreate(
       ['id' => 1],
       ['geschichte_text1' => $request->geschichte_text1]
    );
    $geschichte2 = Geschichte::updateOrCreate(
       ['id' => 2],
       ['geschichte_text2' => $request->geschichte_text2]
    );
    $geschichte3 = Geschichte::updateOrCreate(
       ['id' => 3],
       ['geschichte_text3' => $request->geschichte_text3]
    );

    $geschichte1->save();
    $geschichte2->save();
    $geschichte3->save();

    return redirect('/geschichte');
}

更详细的问题

我无法获得重复密钥更新'部分工作。
每次更新时都会创建一个新条目。我希望每个条目的id始终相同,只是用该id覆盖旧条目。

我会非常感谢任何帮助。我几个小时都在努力解决这个问题......

更新

<?php

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

class CreateGeschichteTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('geschichte', function (Blueprint $table) {
            $table->increments('id');
            $table->text('geschichte_text1');
            $table->text('geschichte_text2');
            $table->text('geschichte_text3');
            $table->timestamps();
        });
    }

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

2 个答案:

答案 0 :(得分:5)

您希望在您希望独特的列上没有唯一的密钥设置。为了使用on duplicate key update,您需要这样做,以便您的数据库服务器知道它是否需要插入或更新。

不幸的是,Laravel并不支持on duplicate key update语法。这很有用,因为它会尝试插入,如果它已经在表中,那么它将在一个查询中相应地更新列。

使用Laravel的updateOrCreate方法,它首先查询表以查看是否需要生成插入或更新语句,然后相应地继续。你没有获得只运行一个查询的优势,但与此同时,Laravel正在处理所有额外的逻辑,因此需要进行轻微的权衡。

答案 1 :(得分:2)

控制器中的大部分内容都不是必需的。我也有点担心你正在使用的数据库结构,为什么你要执行控制器中显示的任务。以下应该是您所需要的:

public function alterGeschichte(Request $request)
{
    Geschichte::updateOrCreate(
       ['id' => 1],
       ['id' => 1, 'geschichte_text1' => $request->geschichte_text1]
    );

    Geschichte::updateOrCreate(
       ['id' => 2],
       ['id' => 2, 'geschichte_text2' => $request->geschichte_text2]
    );

    Geschichte::updateOrCreate(
       ['id' => 3],
       ['id' => 3, 'geschichte_text3' => $request->geschichte_text3]
    );

    return redirect('/geschichte');
}

如果这些是创建新记录,很可能是因为没有记录这些ID。