В моем приложении 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_type, которые связаны с какой-либо группой. Поэтому я хочу преобразовать это:
$taskTypes = TableRegistry::get('TaskTypesTaskTypesGroups')
->find('all', [
'contain' => ['TaskTypes', 'TaskTypeGroups']
]);
Для outer join
который вернет все типы_задач (независимо от того, принадлежат ли они к группе задач / нет)
Задача ещё не решена.
Других решений пока нет …