2016-11-21 10 views
7

Я пытаюсь получить запись из таблицы базы данных posts, используя ее идентификатор. Я уже давно ударил головой по методу find(), смутившись, почему он не работает. Вот мой запрос, который выглядит правильно для меня, но не получилось:Eloquent: find() and where() use laravel

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

Неохотно я сделал это:

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

и достаточно удивительно, что он работал, но я понятия не имею, как это сделать.

Я также знаю, что в отличие от find(), where() является построитель запросов, и поэтому я мог бы также использовать его как это: Post::where('id', $id)->first()

Любые идеи о разнице в пути методы работы?

ответ

7

Ваш код выглядит хорошо, но есть несколько вещей, чтобы быть в курсе:

Post::find($id); действует на первичный ключ, если вы установили первичный ключ в вашей модели в нечто иное, чем id, выполнив:

protected $primaryKey = 'slug'; 

затем find будет искать по этому ключу вместо.

Laravel также ожидает, что id быть целым числом, если вы используете что-то другое, чем целое число (например, в виде строки), необходимо установить увеличивающиеся свойства на вашу модель ложь:

public $incrementing = false; 
3

Для добавьте к комментарию craig_h выше (у меня в настоящее время недостаточно комментариев, чтобы добавить это в качестве комментария к его ответу, извините), если ваш первичный ключ не является целым числом, вы также захотите сообщить своей модели, какой тип данных он , установив keyType в верхней части определения модели.

public $keyType = 'string' 

Красноречивые понимает, любые из типов, определенных в функции castAttribute(), которые, как из Laravel 5.4 являются: INT, поплавок, строковые, BOOL, объект, массив, сбор, дата и временных меток.

Это гарантирует, что ваш первичный ключ будет правильно помещен в эквивалентный тип данных PHP.

Смежные вопросы