Мое приложение позволяет пользователю создавать scenarios
связывая вместе soe_blocks
, В очереди, soe_blocks
ссылаются на переменное число soe_entries
,
Строить scenarios
, soe_blocks
связаны с scenario
и по заказу offset
, soe_blocks
может быть использован во многих scenarios
, soe_entries
может относиться только к одному soe_block
я считать отношение определяется как:
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 |
У меня есть много других вопросов, например, как сохранить и т. Д., Но я решил, что сначала мне нужно, чтобы это заработало.
Итак, мои вопросы на данный момент:
мои ассоциации правильны?
Первые два есть, но тогда должно быть:
soe_blocks
hasOne soe_entries
soe_entries
принадлежит soe_blocks
Как мне получить все ассоциации для просмотра?
Содержа их, как вы это делали в первом примере. Похоже, что этот вопрос возникает из вопроса, как получить доступ к данным таблицы объединения, что очень просто, данные таблицы объединения устанавливаются для объекта целевой таблицы (Scenario
или же SoeBlock
в зависимости от того, с какой стороны / таблицы вы выполняете запрос), в свойстве с именем _joinData
:
$joinTableEntity = $scenario->soe_blocks[0]->_joinData;
$offset = $joinTableEntity->offset;
Вы можете легко собрать информацию о структуре данных, сбросив содержимое вашей сущности:
debug($scenario);
Смотрите также
Других решений пока нет …