Question

This is pretty weird and I have no idea what i'm doing wrong. I have 2 models:

class Project extends Eloquent {
   public function status()
   {
       return $this->belongsTo('ProjectStatus','status_id');
   }
}

and

class ProjectStatus extends Eloquent {
    protected $table = 'PStatus';
    public function projects()
    {
       return $this->hasMany('Project');
    }
}

The table "projects" has the proper foreign keys:

Schema::create('PStatus', function($table) {
  $table->increments('id');
  $table->string('name', 64);
  $table->unique('name');
});
Schema::create('Projects', function($table) {
  $table->increments('id');
  $table->string('name', 100);
  $table->integer('status_id')->unsigned();
  $table->foreign('status_id')->references('id')
    ->on('PStatus')
    ->onDelete('cascade');
});

In the database (for example) I have only 1 project: "Project_1" (id = 1) with status_id = 1 (Lets say status name = "Open"). If I execute the following query:

$projects = Project::with(array('status' => function($query){
    $query->where('name', '<>', 'Open');
}))->get();

I'm still getting the project in the results!!. This is the sql log:

array (size=3)
  'query' => string 'select * from `PStatus` where `PStatus`.`id` in (?) and `name` <> ?'    (length=67)
  'bindings' => 
    array (size=2)
      0 => int 1
      1 => string 'Open' (length=4)
  'time' => float 0.36

if I print:

var_dump($projects->count()); I still get 1 project! How come? I can easily solve my problem by changing the query to something like:

$projects = Project::where('status_id', '<>', 1)->get(); //assuming that status_id=1 => "Open"

but i prefer not to use ids directly when I guess the method with should work. What am I doing wrong here???

Was it helpful?

Solution

Actually this is the answer: Eloquent Nested Relation with Some Constraint

A huge confusion with the with method. I should have used a join.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top