MVCGrid w / Expander (родительский), вызывающий MVC Form (дочерний) и загружающий дочернюю запись - ОБНОВЛЕНО - PullRequest
0 голосов
/ 05 февраля 2012

Моя многоуровневая сага MVCGrid / MVCForm / MVCGrid продолжается ....

Я использую вложенные MVCGrids с кнопками расширения, которые вызывают MVCForms для выполнения различных операций с данными. ВСЕ таблицы MySQL в этом процессе имеют элемент данных «id», который является первичным ключом для каждой таблицы. Каждая таблица mySQL также имеет точку на своего родителя, когда это необходимо, используя соглашение об именовании _id. Все внешние ключи были настроены в MySQL для работы таким же образом.

Модель для родителя выглядит так:

класс Model_uidcontrol extends Model_Table {

public $entity_code='uidcontrol';
public $table_alias='uc';

function init(){
    parent::init();

Модель для ребенка выглядит так:

Класс Model_uiddetails extends Model_Table {

public $entity_code='uiddetails';
public $table_alias='ud';
function init(){
    parent::init();

У каждой модели есть собственный идентификатор и указатель на родителя.

Столбец расширения в MVCGrid (родительский) вызывает эту дочернюю функцию:

$um=$this->add('MVCForm');

$um->setModel('uiddetails')
    ->loadData(($_GET['uidcontrol_id']));

Я пробовал это в детской модели:

    $this->addRelatedEntity('uc','uidcontrol','uidcontrol_ID');

и это также:

$this->addField('uidcontrol_id')
->refModel('Model_uidcontrol')
        ->caption('System Info')
        ->visible(true);

Я пробовал каждую технику в отдельности и вместе, чтобы получить записи о детях, которые должны быть согласованы с соответствующим родителем.

debug () показывает это

где

ud.id = '121'
ud.uidcontrol_id = '121'

Хорошо, я понимаю $ GET и как он работает и как это относится к dsql - по крайней мере, я так думаю.

Что я не могу понять, так это сказать MVCForm, что нужно использовать "ud.uidcontrol_id = '121" через $ GET при сборке dsql для загрузки данных и не использовать 'ud.id'

В приведенном выше примере есть родительская запись "uidcontrol" с этим идентификатором. Я установил, что идентификатор дочерней записи равен 121, чтобы посмотреть, будет ли она извлекать данные и отображать их в форме. ОК, данные отображаются как надо.

Когда я пытаюсь использовать этого родителя, у которого 'id' = 10, debug () производит это

ud.id = '10'
ud.uidcontrol_id = '10'

и данные не возвращаются. Существует запись uidcontrol с id = 10, но dsql также пытается сопоставить с ud.id = 10.

Я могу рассказать больше о том, что я работаю, чтобы уточнить, что я пытаюсь сделать, если это поможет.

В идеале я хотел бы сказать MVCForm: "Эй! Не используйте элемент данных 'id' при сборке dsql, используйте тот, который я предоставляю вместо этого. Проблема в том, что я не могу понять, как это сделать ... но я многому научился по пути. Мне кажется, что я, вероятно, "слишком много думаю" здесь.

Спасибо за любые предложения!

Понедельник, 6 февраля Примечания:

var_dump ($ _ GET); говорит:

'id' => строка '10' (length = 2) <=== uidcontrol.id 'uidcontrol_id' => строка '10' (длина = 2) <=== uidcontrol.id </p>

Я пишу это:

$um->setModel('uiddetails')
    ->addCondition('uidcontrol_id',($_GET['id']))
    ->loadData(($_GET['id']));

И отладка SQL показывает, что это строится:

, где

ud.id = '10'
ud.uidcontrol_id = '10'

Проблема в том, что я хочу ТОЛЬКО "ud.uidcontrol_id = '10'". Таблица uiddetails имеет собственный идентификатор 125 и значение uidcontrol_id 10. В результате запрос не возвращает запись.

1 Ответ

0 голосов
/ 06 февраля 2012

Метод loadData загружает записи только по их идентификатору. Чтобы связать «дочернюю» модель через его запись, на которую вы ссылаетесь, вы должны использовать setMasterField или addCondition, чтобы указать модели фильтрацию отношений.

...