IDを使用してposts
データベーステーブルからレコードを取得しようとしています。私はかなり前からfind()メソッドに頭を打ち続けてきましたが、なぜそれが機能しなかったのかについて混乱しています。これは正しいように見えますが、機能しなかったクエリです。
$post = Post::find($id);
$post->delete();
しぶしぶこれをやった:
$post = Post::where('id', $id);
$post->delete();
驚いたことに、うまくいきましたが、どうすればいいかわかりません。
また、find()
とは異なり、where()
はクエリビルダーであるため、次のように使用することもできます。Post::where('id', $id)->first()
メソッドの動作方法の違いについてのアイデアはありますか?
コードは正常に見えますが、注意すべき点がいくつかあります。
モデルの主キーをid
以外に設定している場合、Post::find($id);
は主キーに作用します。
protected $primaryKey = 'slug';
find
は代わりにそのキーで検索します。
Laravelはid
が整数であることも期待しています。整数以外のもの(文字列など)を使用している場合、モデルの増分プロパティをfalseに設定する必要があります。
public $incrementing = false;
上記のcraig_hのコメントに追加するには(現在、彼の回答にコメントとして追加するのに十分な担当者がいません、申し訳ありません)、主キーが整数でない場合は、モデルにどのデータ型を指定するかを指定することもできますつまり、モデル定義の上部にkeyTypeを設定します。
public $keyType = 'string'
EloquentはLaravel 5.4以降のcastAttribute()
関数で定義されているタイプを理解します:int、float、string、bool、object、array、collection、date、timestamp。
これにより、主キーが同等のPHPデータ型に正しくキャストされます。