所以我试图创建一个搜索过滤器。
我创造了这个:
$data = Input::all();
$ads = new Ads();
if($data['description']) {
$ads = $ads->where('description', 'LIKE', '%' . $data['description'] . '%');
}
if($data['min']) {
$ads = $ads->where('price', '>', $data['min']);
}
if($data['max']) {
$ads = $ads->where('price', '<', $data['max']);
}
我有$ data ['city']。但问题是$ ads没有城市,它有userID,每个用户都有自己的城市。我将如何做这样的事情,但它会实际搜索拥有此广告的用户,并检查该城市是否与搜索过的城市一样。
我试过这样的事情:
$resultAds = $ads;
if($data['city']) {
foreach($resultAds as $rAds) {
if($rAds->compareCity($data['city'])) {
$resultAds[] = $rAds;
}
}
}
$resultAds = $resultAds->paginate(12);
但那个dosnt工作。 它给出了这个错误: Symfony \ Component \ Debug \ Exception \ FatalErrorException(E_ERROR) 在非对象上调用成员函数compareCity() $ rAds用于某种原因布尔值?我认为那是因为我没有完成 - &gt; get();但我不能这样做,因为我想对结果进行分页。
感谢您的帮助。
所以现在我的问题是创建一个realationship来从用户表中获取city field。
id
description
price
userID
id
username
password
phone
city
我需要做出相关信息,这样我就可以根据广告表中带有用户ID的用户所在的城市获取所请求城市的所有广告。
答案 0 :(得分:1)
只要您的关系方法设置正确,您就会想要使用whereHas。
if($data['city'])
{
$ads->whereHas('users', function($q) use ($data)
{
$q->where('city', $data['city']);
});
}
答案 1 :(得分:1)
如果用户的广告属于belongsTo关系,那么您不需要表格,甚至不需要设置关系来过滤用户表格中的城市字段。您可以在users表上进行联接。我假设你的用户表叫做用户:
if($data['city']) {
$ads = $ads->join('users', 'users.id', '=', 'city.userID')
->where('users.city','like','%'.$data['city'].'%');
}
与whereHas连接的优点是它没有针对ads表的每一行执行的子查询,从而提高了效率。此外,如果您始终加入用户表,无论是否有城市过滤器,您都可以将城市从用户拉入广告,而无需执行其他查询或与()关系。像这样:
$ads = $ads->join('users', 'users.id', '=', 'city.userID')
if($data['city']) {
$ads = $ads->where('users.city','like','%'.$data['city'].'%');
}
后:
$result = $ads->get(['ads.*', (new Illuminate\Database\Query\Expression('users.city')]);
或者如果您要对结果进行分页:
$result = $ads->paginate($pageSize, [
'ads.*',
(new Illuminate\Database\Query\Expression('users.city'))
]);
$ad
中的每个$result
都会有一个$ad->city
字段。
答案 2 :(得分:0)
所以答案是这样的:
if($data['city']) {
$ads = $ads->whereHas('users', function ($q) use($data) {
$q->where('city','LIKE','%'.$data['city'].'%');
});
}
这是有效的解决方案。这有点取自另一个答案。
我需要在模型中添加它:
public function users() {
return $this->belongsTo('User');
}
现在它有效。 谢谢大家的帮助!