Laravel使用多个表搜索数据库

时间:2016-02-10 14:25:25

标签: php laravel search orm eloquent

我有一个名为records的表格,其中user_id列链接到users表以设置所有权。

我可以使用搜索字符串title正确过滤记录:

$records->where('title', 'LIKE', '%'.$search.'%');

但我还要返回包含users.firstnameusers.lastname的结果,这是我的(糟糕的)加入尝试:

$records->join('users', 'users.id', '=', 'records.user_id')
        ->where('users.firstname', 'LIKE', '%'.$search.'%')
        ->orWhere('users.lastname', 'LIKE', '%'.$search.'%')
        ->orWhere('title', 'LIKE', '%'.$search.'%');

// SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in order clause is ambiguous

3 个答案:

答案 0 :(得分:1)

在我等待更好的答案时,我找到了一个有效的解决方案但它不是最佳的,因为它涉及一个额外的查询来收集作者user_id并随后使用它查询records

// Get the author ID
$author = DB::table('users')
                ->select(DB::raw('CONCAT_WS(" ",`firstname`,`lastname`) as `fullname`,id'))
                ->having('fullname', 'LIKE', '%'.$search.'%')
                ->first();

// $author output:
stdClass Object
(
    [fullname] => John Doe
    [id] => 35
)

// Query the records using the gathered ID
$records->where('user_id', $author->id)
        ->orWhere('title', 'LIKE', '%'.$search.'%');

此解决方案的问题:除了额外查询外,如果有人搜索John DoeSome Title,则结果是正确的。但是,如果搜索John Doe Some Title,则不显示任何内容,因为无法找到作者和标题。

答案 1 :(得分:0)

如果我了解您希望通过使用$ search过滤来返回记录中的结果,并且还希望显示此记录的用户信息。 您可以使用Eloquent。 你的模特必须是:
在用户模型中:

public function records()
    {
        return $this->hasMany(Record::class);
    }

在记录模型中:

public function user()
    {
        return $this->belongsTo(User::class);
    }

在控制器中:

   Record::where('title', 'LIKE', '%'.$search.'%')
           ->with('user')
           ->first();

答案 2 :(得分:-1)

您需要设置它还在内部查询中使用搜索参数:

$records->join('users', function($join) use ($search)
{
    $join->on('users.id', '=', 'records.user_id')
         ->where('users.firstname', 'LIKE', '%'.$search.'%')
         ->orWhere('users.lastname', 'LIKE', '%'.$search.'%');
});