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'))
    ]);