Carlos Salazar
Carlos Salazar

Reputation: 1908

How can I filter a query using laravel relationships

I have a table of items that contain info of the items. Plus, I have 3 other tables for some characteristics that could have more than one.

Follows an example:

table items
 -----------------------
|  id  | price | stock |
 -----------------------
|  1   | 19    |  99   |
 ----------------------- 
table tallas
 -----------------------------
|  id  | item_id| description |
 -----------------------------
|  1   |   1    |    large    |
 -----------------------------
table colors
 -----------------------------
|  id  | item_id| description |
 -----------------------------
|  1   |   1    |    blue     |
 -----------------------------
table materials
 -----------------------------
|  id  | item_id| description |
 -----------------------------
|  1   |   1    |    cotton   |
 -----------------------------

I want to know if there is a way where I can filter an item passing the item_id to the tallas relationship without using join (for example).

My model looks like this:

<?php

class Item extends Eloquent{
    use Conner\Tagging\TaggableTrait;

    public function tallas()
    {
        return $this->hasMany('Talla','item_id');
    }
    public function colores()
    {
        return $this->hasMany('Color','item_id');
    }
    public function materiales()
    {
        return $this->hasMany('Material','item_id');
    }
    public function imagenes()
    {
        return $this->hasMany('ItemImage','item_id');
    }
}

And I have tried this:

$items = Item::with('imagenes')
         ->with(array('tallas' => function($query) use($dataFilter) {
             $query->where('id','=',$dataFilter['filter-size']);
         }));

But this return all the items and filter the tallas , using the example tables if i look for an item small it will return something like this.

[item]{
    id:1,
    price:19,
    stock:99,
    tallas:
        []...
    colores:
        []...
    materiales:
        []...
}

It should not return any item, any help?


EDITED

i forget to mention i'm using laravel 4.2

Upvotes: 1

Views: 130

Answers (1)

Rwd
Rwd

Reputation: 35210

If I understand you question correctly I think you want whereHas e.g.

$items = Item::with('imagenes')
        ->whereHas('tallas', function ($query) use ($dataFilter) {
            $query->where('id', '=', $dataFilter['filter-size']);
        });

https://laravel.com/docs/4.2/eloquent#querying-relations

Hope this helps!

Upvotes: 1

Related Questions