CakePHP 3.6.14: Внешнее соединение между таблицами (с использованием таблицы соединений) - PullRequest
0 голосов
/ 31 января 2019

В моем приложении CakePHP у меня есть 3 таблицы (2 таблицы и 1 таблица соединений):

task_types[id, name], task_type_groups[id, name], (junction table) task_types_task_types_group[id, task_type_id, task_types_group_id]

Я хочу заполнить таблицу в моем представлении и отфильтровать ее, если пользовательвыбирает task_type_group.

Так что в представлении у меня есть этот код для фильтра и таблицы:

<div class="taskElements index large-9 medium-8 columns content">
    <div class="row">
        <?php echo $this->Form->create('AddTaskTypeToProject', array('action' => 'index')); ?>
        <?php echo $this->Form->control('task_type_groups', ['options' => $taskTypeGroups, 'empty' => true]); ?>
        <?php echo $this->Form->button(__('Filter'), ['class'=>'btn-success']); ?>
        <?php echo $this->Form->end(); ?>
    </div>

    <h3><?= __('Task Type Groups') ?></h3>
    <?php echo $this->Form->create('AddTaskTypeToProject', ['url'=>['action' => 'add']]); ?>
    <table cellpadding="0" cellspacing="0">
        <thead>
            <tr>
                <th scope="col"><?= $this->Paginator->sort('id') ?></th>
                <th scope="col"><?= $this->Paginator->sort('name') ?></th>
                <th scope="col"><?= $this->Paginator->sort('select') ?></th>
                <th scope="col"><?= $this->Paginator->sort('task_types_group_id') ?></th>
            </tr>
        </thead>
        <tbody>      
            <?php foreach ($taskTypes as $id => $taskType): ?>      
            <tr>
                <td><?= $this->Number->format($taskType->task_type->id) ?></td>
                <td><?= $taskType->task_type->name ?></td>
                <?= $this->Form->hidden("$id.id",['value' => $taskType->task_type->id]); ?>
                <?= $this->Form->hidden("$id.name",['value' => $taskType->task_type->name]); ?>
                <td><?= $this->Form->control("$id.checked", ['type' => 'checkbox']);?></td>
                <td><?= $taskType->task_types_group_id != 0 ? $this->Html->link($taskType->task_type_group->name, ['controller' => 'TaskTypeGroups', 'action' => 'view', $taskType->task_type_group->id]) : '' ?></td>

            </tr>
            <?php endforeach; ?>            
        </tbody>
    </table><?php
    echo $this->Form->submit('Add');
    echo $this->Form->end();?>
</div>

И в контроллере:

public function index()
{        

    if($this->request->is('post'))
    { //filtering works as expected
       if($this->request->getData('task_type_groups') != null){
           $taskTypes = TableRegistry::get('TaskTypesTaskTypesGroups')
                            ->find('all', [
                                'conditions' => ['TaskTypesTaskTypesGroups.task_types_group_id' => $this->request->getData('task_type_groups')],
                                'contain' => ['TaskTypes', 'TaskTypeGroups']
                            ]);
       }
       else{ //this is not working
            $taskTypes = TableRegistry::get('TaskTypesTaskTypesGroups')
                            ->find('all', [
                                'contain' => ['TaskTypes', 'TaskTypeGroups']
                            ]);
       }

       $this->set(compact('taskTypes'));
    }
    else
    {
        $taskTypes = TableRegistry::get('TaskTypes')->find('all', [
                                'contain' => ['TaskTypesTaskTypesGroups']
                            ]);

        $this->set(compact('taskTypes'));
    }

    $taskTypeGroups = TableRegistry::get('TaskTypeGroups')->find('list');
    $this->set(compact('taskTypeGroups'));
}

Если пользователь фильтрует таблицу, то она работает, и я получаю только task_types, которые принадлежат выбранной группе.Но если фильтр пуст, то я не получаю типы task_types, которые связаны с какой-либо группой.Поэтому я хочу преобразовать это:

$taskTypes = TableRegistry::get('TaskTypesTaskTypesGroups')
                            ->find('all', [
                                'contain' => ['TaskTypes', 'TaskTypeGroups']
                            ]);

в outer join, который будет возвращать все типы_задач (независимо от того, принадлежат ли они к группе задач / типов)

...