Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel Eloquent::Find() returning NULL with an existing ID

It's pretty straightforward as it's the most basic thing but I don't know what I'm missing:

Having a model called Site

I'm using Eloquent ORM, so when I call (in a controller)

$oSite = Site::find(1)

and then

var_dump($oSite);

It returns a value of NULL.

But when I check the database, the table 'sites' actually contains the following item:

id: 1
user_id: 1
name: test

In my Site model I have the following code:

use Illuminate\Database\Eloquent\ModelNotFoundException;

 Class Site extends Eloquent {

        protected $table = 'sites';

        protected $fillable = ['user_id', 'name'];
 }

Instead, if I gather the item with the following:

$oSite = DB::table('sites')
                ->where('id', 1)
                ->first();

It works and I get the correct register.

What I'm doing wrong? Which part of the documentation I didn't get?

EDIT:

Model code can be checked above.

Controller:

use Illuminate\Support\Facades\Redirect;
class SiteManagementController extends BaseController {

...

    public function deleteSite()
    {
        if (Request::ajax())
        {
            $iSiteToDelete = Input::get('siteId');

            $oSite = Site::find($iSiteToDelete);

            return var_dump($oSite);
        }
        else
        {
            return false;
        }
    }
}

EDIT 2: (SOLVED)

Real reason why wasn't working:

I had originally in my model code the following:

use Illuminate\Database\Eloquent\SoftDeletingTrait;
use Illuminate\Database\Eloquent\ModelNotFoundException;

Class Site extends Eloquent {

    protected $table = 'sites';

    use SoftDeletingTrait;

    protected $dates = ['deleted_at'];

    protected $fillable = ['user_id', 'name'];
}

Problem was I added a 'deleted_at' column after I started the project and when I applied migrations, I didn't have softdeleting enabled. Obviously, I did a second error, forgetting to enable 'deleted_at' to be nullable, hence all inserts went had a wrong timestamp (0000-00-00 ...).

Fix:

  1. Made nullable 'deleted_at' column.

  2. Set all wrong 'deleted_at' timestamps to NULL.

like image 347
zedee Avatar asked Oct 01 '14 11:10

zedee


People also ask

Is null in Laravel eloquent?

In pure SQL, we would use the IS NOT NULL condition, and the query would look like this: SELECT * FROM users WHERE last_name IS NOT NULL; The equivalent to the IS NOT NULL condition in Laravel Eloquent is the whereNotNull method, which allows you to verify if a specific column's value is not NULL .

What does get () do in Laravel?

For creating ::where statements, you will use get() and first() methods. The first() method will return only one record, while the get() method will return an array of records that you can loop over. Also, the find() method can be used with an array of primary keys, which will return a collection of matching records.

What is firstOrNew in Laravel?

The firstOrNew method is really useful for finding the first Model that matches some constraints or making a new one if there isn't one that matches those constraints. You can take a piece of code that looks like this: 1$user = User::where('email', request('email'))->first(); 3if ($user === null) {

Is eloquent an ORM?

Eloquent is an object relational mapper (ORM) that is included by default within the Laravel framework. An ORM is software that facilitates handling database records by representing data as objects, working as a layer of abstraction on top of the database engine used to store an application's data.


1 Answers

You're not returning your model.

var_dump prints output and returns nothing.

do this instead:

dd($oSite); // stands for var_dump and die - a helper method

and even better, simply return the model:

return $oSite; // will be cast to JSON string
like image 168
Jarek Tkaczyk Avatar answered Oct 06 '22 17:10

Jarek Tkaczyk