Laravel красноречивые реляционные запросы с моделями - PullRequest
0 голосов
/ 04 февраля 2019

До того, как изменить код запроса в форме поиска, я использовал приведенный ниже запрос, и он отлично работал.

...
$query = Job::where('is_trash', 0);
$query = $query->where('created_at', '>=', Carbon::parse($rFrom)->startOfDay())
        ->where('created_at', '<=', Carbon::parse($rTo)->endOfDay())
        ->where('customer_name', 'like', '%' . $rName . '%')
        ->where('project_name', 'like', '%' . $rProject . '%')
        ->where('job_type', 'like', '%' . $rType . '%');
...

Но теперь я изменил структуру таблицы, как показано ниже, для отображения имени поля с помощью реляционных запросов.

Таблица заданий

  +----------------------------------------------------+
     ID | customer_id | job_project_id | job_type_id | ...                                         
  +----------------------------------------------------+
     1  | 1           | 1             | 1       | ...
  +----------------------------------------------------+
     2  | 2           | 7             | 2       | ...
  +----------------------------------------------------+

Таблица заданий проекта

  +-------------------------------+
     ID | customer_id | name | ...                                         
  +-------------------------------+
     1  | 1           | 1    |...
  +-------------------------------+
     2  | 2           | 7    | ...
  +-------------------------------+

Таблица заданий типа

  +------------------+
     ID | name  | ...                                         
  +------------------+
     1  | test1 |...
  +------------------+
     2  | test2 | ...
  +------------------+

Также включены, как показано ниже, простые отношения в модели Job.Эти вещи определили тип varchar как строку.но модель Job определила только идентификатор этой модели как customer_id, project_id и jobType_id в таблице заданий.

...

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

public function customer()
{
    return $this->hasOne(Customer::class);
}

public function jobProject()
{
    return $this->hasOne(JobProject::class);
}

public function jobType()
{
    return $this->hasOne(JobType::class);
}
...

Основной вопрос состоит в том, что если входными данными поиска являются customer_name, project_name и job_type, то как сделать цепочку реляционных запросов запроса для?потому что таблица Job просто включает эти идентификаторы.

1 Ответ

0 голосов
/ 04 февраля 2019
<?php 

// Build primitive query
$jobQuery = Job::where('is_trash', 0);

// Use when conditional to check if you need to filter something
$jobQuery->when($from && $to, function($q) use($request) {
        $q->where('created_at', '>=', Carbon::parse($from)->startOfDay())
            ->where('created_at', '<=', Carbon::parse($to)->endOfDay());
    });
// Use whereHas to add a where clause in relations
$jobQuery->when($customerName, function($q) use($request) {
    $q->whereHas('customer', function ($subq) {
        $subq->where('name', 'like', '%' . $customerName . '%');
    });
});


$jobQuery->when($projectName, function($q) use($request) {
    $q->whereHas('jobproject', function ($subq) {
        $subq->where('name', 'like', '%' . $projectName . '%');
    });
});

$jobQuery->when($jobType, function($q) use($request) {
    $q->whereHas('jobtype', function ($subq) {
        $subq->where('name', 'like', '%' . $jobType . '%');
    });
});
...