夜の歌

プログラミング、音楽、本について緩く書いていきます。

【Laravel】updateメソッドで保存する時にハマった

データの更新をする際に、updateメソッドを使って実行。そして、ハマった。そのコードは、下記。

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Model\Book;

class BookController extends Controller
{
    public function index(Request $request)
    {
        $book = Book::where('page', 100)->get(['page'])->first();
        $book->page = 5;
        $book->update();
    }
}

ログに実行したsqlを出力しているので、確認してみる。

[2019-08-31 15:52:22] local.INFO: Query Time:11.06s] select `page` from `book` where `page` = ?  
[2019-08-31 15:52:22] local.INFO: Query Time:1.53s] update `book` set `page` = ?, `updated_at` = ? where `id` is null

2行目でupdate文のsql。コード上では、「wehre is null」は使っていない。恐らく、updateメソッド内で実装しているのかな。

それで、下記のようにgetの指定カラムにidを追加したら想定通りの動作になった。

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Model\Book;

class BookController extends Controller
{
    public function index(Request $request)
    {
        $book = Book::where('page', 100)->get(['id', 'page'])->first();
        $book->page = 5;
        $book->update();
    }
}

ログも確認

[2019-08-31 16:07:58] local.INFO: Query Time:17.51s] select `page`, `id` from `book` where `page` = ?  
[2019-08-31 16:07:58] local.INFO: Query Time:4.01s] update `book` set `page` = ?, `updated_at` = ? where `id` = ?

where句でidを使って絞り込みをかけるようになっていた。なるほど、面白い。updateメソッドの処理の確認をしてみよう。