我试图用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
如果有人可以帮助创建此查询,我将非常感激。
答案 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(“约束急切负荷”部分)。