Laravel 创建搜索筛选器,其中一个字段来自另一个表
所以我尝试创建一个搜索过滤器 我创造了这个:Laravel 创建搜索筛选器,其中一个字段来自另一个表,laravel,laravel-4,Laravel,Laravel 4,所以我尝试创建一个搜索过滤器 我创造了这个: $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
$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']);
}
但那是行不通的。
它给出了以下错误:
Symfony\Component\Debug\Exception\FatalErrorException(E\U错误)
对非对象调用成员函数compareCity()
那么$rAds为什么是布尔值?我想那是因为我还没有完成->get();但我不能这样做,因为我想把结果分页
谢谢你的帮助
所以现在我的问题是创建一个关系,将城市字段从用户表中删除
广告表
用户表
我需要建立一个关联,这样我就可以根据用户从ads表中获取的用户ID所在的城市获取请求城市的所有广告。只要正确设置了关系方法,您就可以使用whereHas
if($data['city'])
{
$ads->whereHas('users', function($q) use ($data)
{
$q->where('city', $data['city']);
});
}
所以答案是这样的:
$resultAds = $ads;
if($data['city']) {
foreach($resultAds as $rAds) {
if($rAds->compareCity($data['city'])) {
$resultAds[] = $rAds;
}
}
}
$resultAds = $resultAds->paginate(12);
if($data['city']) {
$ads = $ads->whereHas('users', function ($q) use($data) {
$q->where('city','LIKE','%'.$data['city'].'%');
});
}
这就是有效的解决方案。这是从另一个答案中取出来的
我需要在模型中添加以下内容:
public function users() {
return $this->belongsTo('User');
}
现在它开始工作了。
谢谢大家的帮助 如果广告与用户的关系是belongsTo关系,那么您不需要一个表,甚至不需要设置一个关系来从用户表中筛选城市字段。您可以在users表上执行联接。我假设您的用户表称为用户:
if($data['city']) {
$ads = $ads->join('users', 'users.id', '=', 'city.userID')
->where('users.city','like','%'.$data['city'].'%');
}
与whereHas相比,join的优点是它没有针对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'))
]);
在
$result
中的每个$ad
都将有一个$ad->city
字段。您有城市表吗?没有,我没有城市表。“城市”字段是由用户输入的。那么,数据库中的城市信息在哪里?它是“用户”表中的一个字段。根据我目前的理解,我认为这不是一个好主意。你应该有一张城市餐桌。如果您有一个city表,那么您可以联接表并获取数据UHM。。我想我还没有建立关系。你能帮我吗?或者给我指一个好的教程。。
$result = $ads->get(['ads.*', (new Illuminate\Database\Query\Expression('users.city')]);
$result = $ads->paginate($pageSize, [
'ads.*',
(new Illuminate\Database\Query\Expression('users.city'))
]);