Laravel - поиск по двум таблицам в одном запросе - PullRequest
0 голосов
/ 08 октября 2018

У меня есть окно поиска ajax, которое ищет в одной таблице.Я хочу расширить поиск и на другую таблицу:

public function search(Request $request)
{
    if($request->ajax()) {
        $output="";
        $files = File::where('id','LIKE','%'.$request->search.'%')
        ->get();
        if($files)
        {
            foreach ($files as $key => $file) {
                $output.='<tr>'.
                '<td><a href=/files/'. $file->id. '>View '. $file->id. '</a></td>'.
                '<td>'.$file->customer->name.'</td>'.
                '<td>'.$file->vehicle_id.'</td>'.
                '<td>'.$file->job_status.'</td>'.
                '<td>'.$file->job_status_note.'</td>'.
                '<td>'.$file->file_status.'</td>'.
                '</tr>';
            }
        }
    }
    return Response($output);
}

Если вы заметили в цикле for, я извлекаю имя клиента на основе идентификатора.

        '<td>'.$file->customer->name.'</td>'.

Этот конкретныйтаблица хранит идентификатор клиента.Я установил отношения с клиентом (клиент имеет много файлов / файлов, принадлежащих одному клиенту).Я пытался расширить свой поиск и до таблицы клиентов.

Вот как я это пробовал -

    $files = File::where('id','LIKE','%'.$request->search.'%')
    ->orWhere('customer->name','LIKE','%'.$request->search.'%')
    ->get();

, похоже, не работает.Что я делаю неправильно?Jist: Я хочу взять ключевое слово и искать, подходит ли это имени клиента.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Как уже упоминалось ранее, убедитесь, что у вас есть что-то подобное в вашей File модели:

class File extends Model
{
  public function customer()
  {
    return $this->belongsTo(Customer::class);
  }
}

После этого вы можете использовать что-то вроде этого, чтобы получить их все:

$files = File::leftJoin('customers', 'customers.id', '=', 'files.customer_id')
         ->where('id','LIKE', '%'.$request->search.'%')
         ->orWhere(DB::raw('LOWER(`customers`.`name`)'), 'LIKE', '%'. strtolower($request->search).'%')
         ->get();
0 голосов
/ 08 октября 2018

В Файловой модели определите отношение к клиенту.
Я считаю, что у клиента много файлов, а у файла один клиент, поэтому.

Вам нужна функция orWhereHas().

эта функция проверяет, существует ли отношение, удовлетворяющее заданным условиям.

class File extends Model
{
    public function customer()
    {
        return $this->belongsToMany(Customer::class);
    }
}

использует отношение для фильтрации результатов.

$files = File::where('id','LIKE','%'.$request->search.'%')
    ->orWhereHas('customer', function ($query) {
        $query->where('name', 'LIKE','%'.$request->search.'%');
    })
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...