2016-02-10 4 views
1

У меня есть таблица с именем records с столбцом user_id, которая ссылается на таблицу users, чтобы установить право собственности.База данных поиска Laravel с несколькими таблицами

я могу правильно фильтровать записи по title с поисковой строкой:

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

Но я хотел бы вернуться и результаты, содержащие users.firstname и users.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 

ответ

0

В то время как я жду лучшего ответа, я нашел решение, которое работает, но это не является оптимальным, поскольку она включает в себя один дополнительный запрос, чтобы собрать автор 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 Doe или Some Title, результаты верны. Но если вы ищете John Doe Some Title, ничего не отображается, потому что автор и заголовок не могут быть найдены.

-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.'%'); 
}); 
+0

Спасибо, но я раздел из ненужного кода, чтобы сохранить он чист. Я обновлю этот пример, чтобы избежать путаницы. – gyo

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(); 
+0

Я хочу вернуть все 'записи' для поискового запроса' John Doe', но 'firstname' и' lastname' находятся в таблице 'users', а не в таблице' records'. Кроме того, я хотел бы вернуть записи для 'John Doe Some Title', где' John Doe' находится в таблице 'users' и' Some Title' в таблице 'records'. – gyo

Смежные вопросы