web-dev-qa-db-ja.com

雄弁:find()およびwhere()の使用法laravel

IDを使用してpostsデータベーステーブルからレコードを取得しようとしています。私はかなり前からfind()メソッドに頭を打ち続けてきましたが、なぜそれが機能しなかったのかについて混乱しています。これは正しいように見えますが、機能しなかったクエリです。

$post = Post::find($id);
$post->delete();

しぶしぶこれをやった:

$post = Post::where('id', $id);
$post->delete();

驚いたことに、うまくいきましたが、どうすればいいかわかりません。

また、find()とは異なり、where()はクエリビルダーであるため、次のように使用することもできます。Post::where('id', $id)->first()

メソッドの動作方法の違いについてのアイデアはありますか?

21
Awa Melvine

コードは正常に見えますが、注意すべき点がいくつかあります。

モデルの主キーをid以外に設定している場合、Post::find($id);は主キーに作用します。

protected  $primaryKey = 'slug';

findは代わりにそのキーで検索します。

Laravelはidが整数であることも期待しています。整数以外のもの(文字列など)を使用している場合、モデルの増分プロパティをfalseに設定する必要があります。

public $incrementing = false;
30
craig_h

上記のcraig_hのコメントに追加するには(現在、彼の回答にコメントとして追加するのに十分な担当者がいません、申し訳ありません)、主キーが整数でない場合は、モデルにどのデータ型を指定するかを指定することもできますつまり、モデル定義の上部にkeyTypeを設定します。

public $keyType = 'string'

EloquentはLaravel 5.4以降のcastAttribute()関数で定義されているタイプを理解します:int、float、string、bool、object、array、collection、date、timestamp。

これにより、主キーが同等のPHPデータ型に正しくキャストされます。

10
SlyDave