Eloquent Multitable查询

时间:2015-12-14 11:04:14

标签: php mysql laravel eloquent twig

我试图用Slim和Eloquent 5.1在php中创建一个搜索功能,但是我有一个问题是从数据库中获取结果。 这是我的表

Listing Table
  id |  title | description | price |  size  |etc...
-----|--------|-------------|-------|--------|-------
  1  | list1  | some text   | 500   |   50   |
  2  | list2  | some text   | 700   |   80   |
  3  | list3  | some text   | 350   |  120   |

Listings Option Table
  id |  id_listing | opt_name    | opt_value
-----|-------------|-------------|----------
  1  |      1      | rooms       |    3
  2  |      1      | baths       |    4
  3  |      2      | rooms       |    8
  4  |      3      | baths       |    1
  5  |      3      | rooms       |    6

Listings Images Table
  id |  id_listing | file_name   
-----|-------------|-------------
  1  |      1      | file_1.png       
  2  |      1      | file_2.png       
  1  |      2      | file_3.png      
  2  |      3      | file_4.png     

现在我找到了一种方法,可以通过

获得所有选项
listado = $app->listing->with(['options'],['imgs'])->get();

我的班级

//Listing Class

class Listing extends Eloquent{
  protected $table = 'listings';


  public function options(){
    return $this->hasMany('Casas\Listing\ListingOption', 'id_listing', 'id');
  }

  public function imgs(){
    return $this->hasMany('Casas\Listing\ListingImg', 'id_listing');
  }

}

// ListingOption class

class ListingOption extends Eloquent{
  protected $table = 'listings_options';

  public function listings()
  {
    return $this->belongsTo('Casas\Listing\Listing', 'id_listing');
  }

}

// ListingImg Class
class ListingImg extends Eloquent{
  protected $table = 'listings_imgs';

  public function listings()
  {
    return $this->belongsTo('Casas\Listing\Listing', 'id_listing');
  }

}

但是我找不到按照我想要的方式过滤查询的方法。我做了很多尝试。

示例:我希望获得价格低于600并且客房数超过2个的所有商家信息。

这样就是列出id 1和3

如果有人可以帮助创建此查询,我将非常感激。

2 个答案:

答案 0 :(得分:3)

您想要使用的是whereHas

  

访问模型的记录时,您可能希望根据关系的存在来限制结果

$result = $app->listing->with('options', 'imgs')
    ->whereHas('options', function ($query) {
        $query->where('opt_value', '>', 2)
            ->where('opt_name', 'room');
    })
    ->where('price', '<', 600)->get();

所以我们在这里做的是,急切地加载选项 imgs 表格,只获取至少有一个选项的列表 opt_value 大于2, opt_name 会议室

您可以在here

中查找有关查询关系的更多信息

答案 1 :(得分:0)

我会尝试这样的事情:

$result = $app->listing->with(
    ['options' => function ($query) {
        $query->where('opt_value', '>', 2);
        }
    ], 
    ['imgs'])->where('price', '<', 600)->get();

最后一个外部where应分配给listing。传递回调的内部where应直接分配给options

看一下docs(“约束急切负荷”部分)。