2016-11-21 47 views
7

Tôi đang cố gắng lấy một bản ghi từ một bảng cơ sở dữ liệu posts bằng cách sử dụng id của nó. Tôi đã đập đầu vào phương thức find() khá lâu, bối rối vì sao nó không hoạt động. Đây là câu hỏi của tôi rằng có vẻ đúng với tôi nhưng đã không làm việc:Eloquent: find() và where() usage laravel

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

Bất đắc dĩ tôi đã làm điều này:

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

và đáng ngạc nhiên đủ, nó làm việc nhưng tôi không có ý tưởng như thế nào.

Tôi cũng biết rằng không giống như find(), where() là một người thợ xây truy vấn và vì vậy tôi cũng có thể sử dụng nó như thế này: Post::where('id', $id)->first()

Bất kỳ ý tưởng về sự khác biệt trong cách các phương pháp làm việc?

Trả lời

7

Mã của bạn có vẻ tốt đẹp, nhưng có một vài điều cần phải nhận thức:

Post::find($id); hành vi thuộc vào khóa chính, nếu bạn đã thiết lập khóa chính của bạn trong mô hình của bạn để một cái gì đó khác hơn id bằng cách thực hiện:

protected $primaryKey = 'slug'; 

sau đó find sẽ tìm kiếm bằng khóa đó thay thế.

Laravel cũng hy vọng id là một số nguyên, nếu bạn đang sử dụng một cái gì đó khác hơn là một số nguyên (ví dụ như là một chuỗi), bạn cần phải thiết lập thuộc tính incrementing trên mô hình của bạn là false:

public $incrementing = false; 
3

Để thêm vào nhận xét của craig_h ở trên (Tôi hiện không có đủ đại diện để thêm điều này làm nhận xét cho câu trả lời của mình, xin lỗi), nếu khóa chính của bạn không phải là số nguyên, bạn cũng sẽ muốn cho mô hình của mình biết loại dữ liệu nào , bằng cách đặt keyType ở đầu định nghĩa mô hình.

public $keyType = 'string' 

hùng biện hiểu bất kỳ các loại quy định tại các castAttribute() chức năng, mà là của Laravel 5.4 là: int, float, string, bool, đối tượng, mảng, bộ sưu tập, cập nhật và dấu thời gian.

Điều này sẽ đảm bảo rằng khóa chính của bạn được truyền chính xác vào loại dữ liệu PHP tương đương.

Các vấn đề liên quan