Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Eloquent: find() and where() usage laravel

I am trying to get a record from a posts database table using its id. I've been banging my head on the find() method for quite sometime now, confused as to why it wasn't working. Here is my query that looks correct to me but didn't work:

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

Reluctantly i did this:

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

and surprisingly enough, it worked but I have no idea how.

I also know that unlike find(), where() is a query builder and so I could also use it like this: Post::where('id', $id)->first()

Any ideas about the difference in the way the methods work?

like image 733
Awa Melvine Avatar asked Nov 21 '16 16:11

Awa Melvine


2 Answers

Your code looks fine, but there are a couple of things to be aware of:

Post::find($id); acts upon the primary key, if you have set your primary key in your model to something other than id by doing:

protected  $primaryKey = 'slug'; 

then find will search by that key instead.

Laravel also expects the id to be an integer, if you are using something other than an integer (such as a string) you need to set the incrementing property on your model to false:

public $incrementing = false; 
like image 122
craig_h Avatar answered Oct 02 '22 08:10

craig_h


To add to craig_h's comment above (I currently don't have enough rep to add this as a comment to his answer, sorry), if your primary key is not an integer, you'll also want to tell your model what data type it is, by setting keyType at the top of the model definition.

public $keyType = 'string' 

Eloquent understands any of the types defined in the castAttribute() function, which as of Laravel 5.4 are: int, float, string, bool, object, array, collection, date and timestamp.

This will ensure that your primary key is correctly cast into the equivalent PHP data type.

like image 38
SlyDave Avatar answered Oct 02 '22 07:10

SlyDave