Связи Zend Framework - определение имен столбцов в findManyToManyRowset ()? - PullRequest
2 голосов
/ 17 сентября 2009

Я работаю над приложением, разработанным с использованием Zend Framework. Я определил отношения в моделях и могу их успешно использовать, например:

$rowset = $row->findManyToManyRowset('People', 'Jobs');

Однако я столкнулся с проблемой, когда возвращаемый набор строк имеет одинаковые имена столбцов в «Людях» и «Заданиях», и поэтому объединяет ключи массива, теряя некоторые данные из окончательного набора строк.

Я понимаю, что могу передать объект Zend_Db_Select в findManyToManyRowset() в качестве одного из параметров, но не могу найти документацию, объясняющую, как его использовать в этом случае, например:

$select = $this->select()->from(array(
                                     'p' => 'people', 
                                     'j' => 'jobs'
                                     ),
                                array( 
                                     'person_id' => 'p.id',
                                     'job_id' => 'j.id',
                                     'person_code' => 'p.code',
                                     'job_code' => 'j.code'
                                     )
                                );  

Если я пытаюсь использовать приведенный выше код, я получаю сообщение, такое как:

Error: No reference rule "" from table People to table Jobs

Может кто-нибудь просветить меня, как это должно быть сделано? Я знаю, что могу изменить имена столбцов в базе данных, но я бы предпочел изменить код, а не перепроектировать структуру моей БД и обновить весь связанный код.

Примечание: без какой-либо формы псевдонимов столбцов, как указано выше, возвращаемый набор строк выглядит следующим образом (то есть объединяет столбцы с одинаковыми именами):

[_data:protected] => Array
    (
        [id] => 1
        [code] => SX342
    )

Приветствия
Matt

Ответы [ 2 ]

2 голосов
/ 26 февраля 2010

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

1) findManyToManyRowset($matchTable, $intersectionTable, $callerRefRule, $matchRefRule, $select); - если вы передаете Zend_Db_Table_Select, вы захотите передать null для правил.

2) Zend_Db_Table_Select, переданный в findManyToManyRowset(), должен быть создан из $matchTable, и можно с уверенностью предположить, что в выражениях where i является псевдонимом для таблицы пересечений, а m является псевдоним таблицы совпадений.

3) В случае коллизий m получит имя ключа в ассоциативном массиве, возвращаемом в php. Выполненный запрос выглядит так:

  SELECT 
    `i`.*, `m`.* 
  FROM 
    `interscetTable` AS `i` 
  INNER JOIN 
    `matchTable` AS `m` 
  ON
    `i`.`fk_m` = `m`.`pk` WHERE (`i`.`fk_o` = ?)  

4) Независимо от того, что возвращаемое значение findManyToManyRowset() будет набором строк, созданным из $matchTable, поэтому, если вам нужно получить какую-либо информацию из пересекающейся таблицы, а также захватить данные для таблицы соответствия, вам, вероятно, понадобится пользовательский Zend_Db_Select и избегайте использования Zend_Db_Table для отображения данных в любом случае.

Итак, рабочий пример, использующий «People» в качестве таблицы соответствия, «Workers» в качестве таблицы пересечения и позволяющий сказать «Clients» в качестве исходной таблицы. Предположим, что таблицы связывают воедино что-то вроде: Люди. id:... -> рабочие. person_id:client_id:job_id -> клиенты: id:...

$client = $clientTable->fetchRow(); /// grab a random client

// fetch all people that have worked for the client ordered by their last name.
$client->findManyToManyRowset("People", "Workers", null, null, 
  $peopleTable->select()->order('m.lastname')); 

// fetch all people that have worked for the client ordered by their hire date:
// `workers`.`hiredate`
$client->findManyToManyRowset("People", "Workers", null, null, 
  $peopleTable->select()->order('i.hiredate')); 
1 голос
/ 10 октября 2009

Моя первая рекомендация - не называть столбцы такими общими именами, как id и code. Эти имена не имеют смысла, и, как вы обнаружили, они также приводят к коллизиям при извлечении результатов в ассоциативный массив.

Вы также неправильно используете интерфейс выбора. Вы должны указать только одну таблицу на from() вызов или join() вызов.

Наконец, я никогда не пытаюсь выполнять сложные запросы через интерфейс отношений Zend_Db_Table. Он предназначен только для простых случаев. Если у вас более сложный запрос, просто напишите SQL-запрос явно.

См. Также Как выполнить объединенный запрос в интерфейсе таблиц ZF?

...