请帮我在雄辩中提出这个问题。企业可以有很多类别。
SELECT b.*
FROM businesses b
INNER JOIN categorybusiness cb
ON b.id = cb.business_id
INNER JOIN category c
ON cb.category_id = c.id
WHERE b.location LIKE '%query1%'
AND b.location LIKE '%query2%'
AND c.name LIKE '%query3%'
AND c.name LIKE '%query4%'
我的表格是......商家 - 包含位置列和类别及业务的数据透视表。
更新: 所以我使用了这个查询...
$business5 = Business::WhereHas('categories', function($q) use($category,$query1)
{
$q->whereRaw("name like '%$category%' or businesses.name like '%$category%' $query1");
})->get();
$ query1看起来像这样但是在一个循环中。
$query1 .= " and businesses.address1 like '%$string%'";
它工作正常,但有人可以帮助我做一个"对抗"这句话很有说服力。
答案 0 :(得分:3)
要进行Eloquent
查询,您需要设置关系并创建一个many-to-many
关系,您需要在两个模型中建立这样的关系:
Business
型号:
class Business extends Eloquent {
//...
public function categories()
{
return $this->belongsToMany('Caregory');
}
}
Category
型号:
class Category extends Eloquent {
//...
public function businesses()
{
return $this->belongsToMany('Business');
}
}
Eloquent
查询(您已有pivot
表):
$businesses = Business::with(array('categories' => function($q) use ($query3, $query4) {
$q->where('categories.name', 'LIKE', '%'. $query3 .'%')
->where('categories.name', 'LIKE', '%'. $query4 .'%');
}))->where('businesses.location', 'like', '%'. $query1 .'%')
->where('businesses.location', 'like', '%'. $query2 .'%')
->get();
要检查结果,只需使用dd($businesses);
并检查收藏集,这样您就可以了解如何在view
中循环播放这些内容。基本上,$businesses
将包含一个集合,集合中的每个$business
模型将包含另一个$categories
集合,因此循环可能是这样的:
@foreach($businesses as $business)
{{ $business->propertyname }}
@foreach($business->categories as $category)
{{ $category->propertyname }}
@endforeach
@endforeach
答案 1 :(得分:1)
假设您有Business
moel设置,这正是您想要的查询,因为@WereWolf建议的急切加载不会在这里完成工作(连接表上的子句与2个单独的查询) :
Business::from('businesses as b')
->join('categorybusiness as cb', 'b.id', '=', 'cb.business_id')
->join('category as c', 'c.id', '=', 'cb.category_id')
->where('b.location', 'like', "%$query1%")
->where('b.location', 'like', "%$query2%")
->where('c.name', 'like', "%$query3%")
->where('c.name', 'like', "%$query4%")
->get(['b.*']);
只要您正确设置whereHas
关系,还有另一种使用belongsToMany
方法的方法
Business::whereHas('categories', function ($q) use ($query3, $query4) {
$q->where('categories.name', 'like', "%$query3%")
->where('categories.name', 'like', "%$query4%");
})->where('businesses.location', 'like', "%$query1%")
->where('businesses.location', 'like', "%$query2%")
->get();