CakePHP: извлечение столбца из таблицы объединения в отношении ownToManay

Мое приложение позволяет пользователю создавать scenarios связывая вместе soe_blocks, В очереди, soe_blocks ссылаются на переменное число soe_entries,

Строить scenarios, soe_blocks связаны с scenario и по заказу offset, soe_blocks может быть использован во многих scenarios, soe_entries может относиться только к одному soe_block

Модель MySQL Workbench

я считать отношение определяется как:

  • scenarios belongsToMany soe_blocks через scenarios_soe_blocks
  • soe_blocks belongsToMany scenarios через scenarios_soe_blocks
  • scenarios_soe_blocks где offset хранится
  • soe_entries Имеется soe_blocks

Таблицы:

scenarios: id | name
data: 0, 'scenario_1'

soe_blocks: id | name
data: 0, 'soe_block_1'
1, 'soe_block_2'

scenarios_soe_blocks: id | scenario_id | soe_block_id | offset
data: 1, 0, 1, 1
2, 0, 2, 2

Модели:

class ScenariosTable extends Table
{
$this->belongsToMany('SoeBlocks', [
'foreignKey' => 'scenario_id',
'targetForeignKey' => 'soe_block_id',
'through' => 'ScenariosSoeBlocks',
'joinTable' => 'soe_blocks'
]);
}

class SoeBlocksTable extends Table
{
$this->belongsToMany('Scenarios', [
'foreignKey' => 'soe_block_id',
'targetForeignKey' => 'scenario_id',
'joinTable' => 'scenarios_soe_blocks',
'through' => 'ScenariosSoeBlocks'
]);
}

class ScenariosSoeBlocksTable extends Table
$this->belongsTo('SoeBlocks', [
'foreignKey' => 'soe_block_id',
'joinType' => 'INNER'
]);
}

Контроллеры:

public function view($id = null)
{
$scenario = $this->Scenarios->get($id, [
'contain' => ['SoeBlocks', 'RunStatus', 'ScenarioLog']
]);

$this->set('scenario', $scenario);
}

Насколько я могу разобрать из CakePHP Doc, это все что мне нужно Но я не мог получить ScenarioController->view() способ вернуть offsets от scenarios_soe_blocks таблица, связанная с soe_blocks,

Я пытался добавить ScenariosSoeBlocks в 'contain' предложение в ScenarioController, но получил ошибку: Scenarios is not associated with ScenariosSoeBlocks, Я нашел ТАК статья, которая предложила добавить следующее в таблицу сценариев:

  $this->hasMany('ScenariosSoeBlocks', [
'foreignKey' => 'scenario_id'
]);

Кажется, это сработало, и теперь я могу запросить ScenariosSoeBlocks в моем контроллере так:

$scenario = $this->Scenarios->get($id, [
'contain' => ['SoeBlocks', 'ScenariosSoeBlocks', 'RunStatus', 'ScenarioLog']
]);

Который по крайней мере получает данные в шаблон представления, но не в единственном объекте, на который я надеюсь. В конце концов, я хочу быть в состоянии CRUD soe_blocks наряду с их связанными soe_entriesв объекте, который выглядит так:

offset | soe_block_id | soe_entry_id |

У меня есть много других вопросов, например, как сохранить и т. Д., Но я решил, что сначала мне нужно, чтобы это заработало.

Итак, мои вопросы на данный момент:

  • мои ассоциации правильны?
  • Как мне получить все ассоциации для просмотра?

2

Решение

мои ассоциации правильны?

Первые два есть, но тогда должно быть:

  • soe_blocks hasOne soe_entries
  • soe_entries принадлежит soe_blocks

Как мне получить все ассоциации для просмотра?

Содержа их, как вы это делали в первом примере. Похоже, что этот вопрос возникает из вопроса, как получить доступ к данным таблицы объединения, что очень просто, данные таблицы объединения устанавливаются для объекта целевой таблицы (Scenario или же SoeBlockв зависимости от того, с какой стороны / таблицы вы выполняете запрос), в свойстве с именем _joinData:

$joinTableEntity = $scenario->soe_blocks[0]->_joinData;
$offset = $joinTableEntity->offset;

Вы можете легко собрать информацию о структуре данных, сбросив содержимое вашей сущности:

debug($scenario);

Смотрите также

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]