Отношение много ко многим - PullRequest
3 голосов
/ 24 июня 2009

Я хочу получить все данные из 3 таблиц

пользователи, свойства и users_properties.

Поэтому я решил, что буду использовать manytomanyRowset. Но, к моему удивлению, я получаю данные из таблицы свойств и таблицы users_properties, но нет данных из таблицы users. Это почему? Мне нужны некоторые столбцы из таблицы users. Есть ли способ сообщить функции manytomanyrowset, что мне также нужны данные из текущей таблицы?

это моя функция

public function fetchRegisteredProperties()
{

    $userTable = $this->getTable();
    require_once APPLICATION_PATH . '/models/DbTable/UsersPropertiesDB.php';
    require_once APPLICATION_PATH . '/models/DbTable/PropertiesDB.php';

    $propertiesRowset = $table->fetchAll();
    $allProperties = array();

    foreach ($propertiesRowset as $row) {
        $propertiesRowset = $row->findManyToManyRowset(
          'Model_DbTable_Properties','Model_DbTable_UsersProperties');
        $allProperties = array_merge($tempArray,$propertiesRowset->toArray()); 
    }

    return $allProperties;
}

спасибо заранее

1 Ответ

6 голосов
/ 24 июня 2009

Я разработал и закодировал функции табличных отношений в Zend Framework.

Ответ на ваш вопрос - нет, метод findManyToManyRowset() извлекает только строки из связанной таблицы, но не объединяет их в соответствующий объект Row. Причина в том, что объект Row в ZF может save() сам вернуться в базу данных, и если вы добавите поля, он не будет знать, что с ними делать.

Таким образом, вы должны реализовать пользовательский объект Row для хранения как пользовательских полей, так и коллекции пользовательских свойств - сохраните пользовательские свойства как объект Rowset.

Затем расширьте __get() и __set(), чтобы он знал, как сопоставить поля в правильный массив при чтении или записи свойств объекта. То есть, если кто-то пытается прочитать или записать поле, которое не является частью пользовательской строки, оно возвращается к пользовательским свойствам Rowset.

Также добавьте save(), чтобы сохранить не только текущую строку, но и вызвать save() в наборе свойств пользователя.

...