2016-11-21 5 views
7

idを使用してpostsデータベーステーブルからレコードを取得しようとしています。私はfind()メソッドで頭を悩ましていましたが、なぜこれが動作しないのか混乱しました。ここでは私には正しい見えますが、うまくいきませんでした私のクエリは次のとおりです。Eloquent:find()and where()usage laravel

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

仕方なく私はこれでした:

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

をし、驚くことに、それが働いたが、私はどのようには考えています。

私はまたfind()とは異なり、where()は、クエリビルダであることを知っているので、私はまた、このようにそれを使用することができます:メソッドの働き方の違いについて Post::where('id', $id)->first()

任意のアイデア?

答えて

7

あなたのコードは正常に見えるが、注意すべき事柄がいくつかあります:あなたが実行してid以外に、あなたのモデルにあなたの主キーを設定している場合、主キーにより

Post::find($id);行為は、:

protected $primaryKey = 'slug'; 

次にfindは、そのキーで検索します。

public $incrementing = false; 
3

へ:

Laravelはまた、あなたが整数以外のものを使用している場合はfalseにあなたのモデルにインクリメントプロパティを設定する必要があります(たとえば、文字列として)idは、整数であることを期待します上記のcraig_hのコメントに追加してください(私は現在、彼の答えにコメントとしてこれを追加するのに十分な担当者がいません)。プライマリキーが整数でない場合は、モデルにどのデータ型であるかを伝えたいモデル定義の先頭にkeyTypeを設定します。

public $keyType = 'string' 

雄弁はLaravel 5.4の通りであるcastAttribute()関数で定義されたタイプの任意の理解:整数、浮動小数点、文字列、ブール値、オブジェクト、配列、コレクション、日付およびタイムスタンプ。

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