столы, соединяющиеся с сводной таблицей в laravel - PullRequest
1 голос
/ 02 марта 2020

Я работаю с laravel 5.8, и у меня есть четыре таблицы:

клиенты: идентификатор | имя | код

задачи: идентификатор | имя

client_task: id | client_id | task_id

monthlies: id | client_id | task_id | exec_date

Где clients и tasks находятся во многих отношениях со многими, а client_task - это сводная таблица

Идея состоит в том, что я хочу создавать таблицу в html, например,

-------------------------------------------
|#|client name|task 1|task 2|task 3|task 4|
-------------------------------------------
|1| client 1  |  ☐   |  ☐   |  /// |  /// |
-------------------------------------------
|2| client 2  | ///  |  ☐   |   ☐  |  ☑   |
-------------------------------------------
|3| client 3  |  ☐   |  ☑   |   ☑  |  /// |
-------------------------------------------

каждый месяц, я получаю всех клиентов и все задачи, и если у клиента есть задача, я показываю флажок еще я показываю пустую td и, если я заканчиваю sh задачу для определенного c клиента, я проверяю эту задачу и вставляю client_id, task_id и текущую дату exec_date в monthlies таблицу .

Я исправляю этот запрос:

$clients = DB::table('monthlies as m')
        ->rightJoin('client_task as clta', function ($join){
            $join->on('clta.client_id', '=', 'm.client_id')
                ->on('clta.task_id', '=', 'm.task_id')
                ->rightJoin('clients as cl', function ($join){
                    $join->on('clta.client_id', '=', 'cl.id')->where('cl.category',1);
                })
                ->Join('category_task as cata', function ($join){
                    $join->on('clta.task_id', '=', 'cata.task_id')
                        ->Join('categories as ca2', 'cata.category_id', '=', 'ca2.id')->where('ca2.type', 1)
                        ->rightJoin('tasks as ta', 'cata.task_id', '=', 'ta.id')->where('ta.period', 1);
                });

        })

        ->select('m.*', 'cl.id as client_id', 'cl.name as client_name', 'cl.code as client_code', 'cl.legal_form as client_legal_form', 'ta.id as task_id', 'ta.name as task_name', 'ta.type as task_type', 'ta.period as task_period')
        ->get();

с этим кодом я получаю только клиенты / задачи, представленные в таблице client_task

Проблема в том, что я хочу показать всех клиентов или задачи, даже если клиент не имеет прикрепленной задачи и наоборот (отсутствует в сводной таблице client_task).

1 Ответ

2 голосов
/ 02 марта 2020

Хорошо, это может потребовать внесения некоторых изменений в ваши отношения, но я думаю, вы увидите преимущества!


Атрибуты и модели сводной таблицы

Если единственная разница между вашей client_task и monthlies таблицей - exec_date, почему бы не объединить две таблицы в client_task?

Вы можете добавить атрибуты сводной таблицы в ваши отношения следующим образом:

Клиент. php

public function tasks()
{
    return $this->belongsToMany(Task::class, 'client_task',`client_id`,'task_id')->withPivot(['exec_date']);
}

Теперь, когда вы получаете Client Task, вы можете получить exec_date, используя * Атрибут 1023 * ($task->pivot->exec_date).

Вы можете даже go делать до выделенных Pivot моделей, как показано в документации здесь


Наличие отношения

Вы можете определить, имеет ли Client заданный Task, используя функцию whereHas().

Client::whereHas('tasks', function (Builder $query) use ($task) {
    $query->where('id', $task->id);
})->get();

Документацию можно найти здесь


Шаблоны

Большая часть кода для управления вашей таблицей будет выполнена в виде блейда. петь простой шаблон логи c:

@foreach ($clients as $client)
    <tr>
    @foreach ($tasks as $task)
        <td>
            @if ($client->tasks->contains($task)) 
                 @if ($client->tasks->where('id', $task->id)->first()->pivot->exec_date)
                     ... checked checkbox ...
                 @else
                     ... unchecked checkbox ...
                 @endif
            @else
                ...
            @endif
        </td>
    @endforeach
    </tr>
@endforeach
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...