创建搜索过滤器和其中一个字段来自其他表

时间:2015-03-25 12:17:02

标签: 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']);
}

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的用户所在的城市获取所请求城市的所有广告。

3 个答案:

答案 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');
}

现在它有效。 谢谢大家的帮助!