如何使用laravel关系过滤查询

时间:2016-10-21 13:47:06

标签: laravel

我有一个包含项目信息的项目表。另外,我有3个其他表可以有多个特征。

举个例子:

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   |
 -----------------------------

我想知道是否有一种方法可以过滤将item_id转换为tallas关系的项目而不使用join(例如)。

我的模型看起来像这样:

<?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');
    }
}

我试过这个:

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

但是这会返回所有项目并过滤tallas,使用示例表格,如果我查找项目small,它将返回这样的内容。

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

它不应该返回任何项目,任何帮助吗?

EDITED

我忘了提及我使用laravel 4.2

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,我认为你想要whereHas例如

$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

希望这有帮助!