Читайте также:
|
|
Реляционная Active Record
Мы уже рассмотрели использование Active Record (AR) для выбора данных из одной таблицы базы данных. В этом разделе мы расскажем, как использовать AR для соединения нескольких связанных таблиц и получения набора связанных данных.
Перед использованием реляционной AR рекомендуется установить ограничения внешних ключей для таблиц базы данных. Это позволит обеспечить непротиворечивость и целостность хранимых данных.
Для наглядности примеров в этом разделе мы будем использовать схему базы данных, представленную на следующей диаграмме сущность-связь (ER).
Диаграмма ER
Информация: Поддержка ограничений внешних ключей различается в разных СУБД. SQLite < 3.6.19 не поддерживает ограничений, но вы, тем не менее, можете их объявить при создании таблиц. Движок MySQL MyISAM не поддерживает внешние ключи.
Установка связей между AR-классами
Перед тем как использовать AR для выполнения реляционных запросов, нам необходимо установить связи между AR-классами.
Связь между двумя AR-классами напрямую зависит от связей между соответствующими таблицами базы данных. С точки зрения БД, связь между таблицами A и В может быть трёх типов: один-ко-многим (например, tbl_user и tbl_post), один-к-одному (например, tbl_user и tbl_profile) и многие-ко-многим (например, tbl_category и tbl_post). В AR существует четыре типа связей:
Установка связей производится внутри метода relations() класса CActiveRecord. Этот метод возвращает массив с конфигурацией связей. Каждый элемент массива представляет одну связь в следующем формате:
'VarName'=>array('RelationType', 'ClassName', 'ForeignKey', …дополнительные параметры)
где VarName — имя связи, RelationType указывает на один из четырёх типов связей, ClassName — имя AR-класса, связанного с данным классом, а ForeignKey обозначает один или несколько внешних ключей, используемых для связи. Кроме того, можно указать ряд дополнительных параметров, о которых будет рассказано позже.
В приведённом ниже коде показано, как установить связь между классами User и Post.
class Post extends CActiveRecord
{
…
public function relations()
{
return array(
'author'=>array(self::BELONGS_TO, 'User', 'author_id'),
'categories'=>array(self::MANY_MANY, 'Category',
'tbl_post_category(post_id, category_id)'),
);
}
}
class User extends CActiveRecord
{
…
public function relations()
{
return array(
'posts'=>array(self::HAS_MANY, 'Post', 'author_id'),
'profile'=>array(self::HAS_ONE, 'Profile', 'owner_id'),
);
}
}
Информация: Внешний ключ может быть составным, то есть состоять из двух и более столбцов таблицы. В этом случае имена столбцов следует разделить запятыми и передать их либо в качестве строки, либо в виде массива array('key1','key2'). Задать свою связь первичного ключа с внешним можно в виде массива array('fk'=>'pk'). Для составных ключей это будет array('fk_c1'=>'pk_c1','fk_c2'=>'pk_c2'). Для типа связи MANY_MANY имя ассоциативной таблицы также должно быть указано во внешнем ключе. Например, связи categories модели Post соответствует внешний ключ tbl_post_category(post_id, category_id). Для каждой добавленной связи неявно создаётся свойство класса. После выполнения реляционного запроса соответствующее свойство будет содержать связанный экземпляр класса AR (или массив экземпляров для связей типа один-ко-многим и многие-ко-многим). Например, если $author является экземпляром AR-класса User, то можно использовать $author->posts для доступа к связанным экземплярам Post.
Дата добавления: 2015-09-10; просмотров: 101 | Поможем написать вашу работу | Нарушение авторских прав |