Friday, March 10, 2017

Laravel 5: Eloquent whereHas subquery doesn't filter results

I'm trying to retrieve some results from a model using a relation and I'm trying to apply some filters on that relationship.

Here is the model:

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class UserProduct extends Model
{

    protected $primaryKey = null;
    public $incrementing = false;
    protected $table = "user_product";

    public $fillable = [
        ...
        "product_id",
        "user_id",
        "is_featured",
        "is_hidden_from_latest"
        ...
    ];

    public function product()
    {
        return $this->belongsTo("\\App\\Models\\Product", "product_id", "id");
    }

    ...

}

and here is the related model:

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected $table = "products";

    public $timestamps = false;

    public $fillable = [
        ...
    ];

    public function userProduct()
    {
        return $this->hasOne("\\App\\Models\\UserProduct", "product_id", "id");
    }

    ...

}

Here is the query on UserProduct model and product relationship:

$user_products = UserProduct::with("product")
    ->whereHas("product", function($q) {
        $q->where("product_status", "live")
            ->where("parent_child", "Child");
    })->where("is_featured", 1)
        ->orWhere("is_hidden_from_latest", 0)
        ->orderBy("is_featured")
        ->orderBy("updated_at")
        ->get();

The problem is that whereHas subquery doesn't seem to filter anything no matter what value to compare to I use for each product_status and parent_child.

Is there something that I don't do correctly?



via Eseth

Advertisement