Вопросы по построению запросов к db

Решил вот воспользоваться запросами CActiveRecord типа save().

  1. Но далеко не все понятно. Что если у меня в модели указано имя таблицы к примеру xxx, а мне нужно выбрать записи из таблицы yyy. Обе таблицы это как бы один модуль. Получается нужно создавать еще одну модель для таблицы? В критериях я параметра не нашел, чтобы можно было указать нужную таблицу. Пока вижу единственный вариант самому писать запрос в модели, но это гораздо дольше получается…

  2. Еще не совсем понял про метод relations(). Как он связывает таблицы, это тоже получается нужно создавать несколько моделей? Или можно в одной модели нашлепать классов и там прописать таблицы, но мне кажется это может в кашу превратится в итоге.

Просто очень не привычно для меня такая запись, мне как-то проще и нагляднее писать запросы самому. Особенно если многотабличные запросы.

Очевидно, вы не совсем поняли суть Active Record :)

Для каждой таблицы БД (ну или почти для каждой) необходимо создавать отдельный класс Active Record.

Метод relations() не связывает таблицы (связи на уровне БД может вообще не быть), а лишь упрощает выборку данных. Например, если в классе User есть связь "posts" (с классом Post), то все сообщения юзера можно получить очень просто: $user->posts.

Думаю, стоит еще раз прочитать Guide и Blog Tutorial.

ну читать, я читал… Только действительно не совсем понял) Потому и пишу.

Просто не думал что требуется такая структура. Таблица = Модель.

Это получается если к примеру есть таблица с товаром

goods

±-±—±------+

|id|name|type_id|

±-±—±------+

и его тип

±-±—+

|id|name|

±-±—+

то мы делаем 2 модели и можем написать в relations() что они как бы связаны?

Но как я понимаю влияет это только на получение записи а не на INSERT и UPDATE ?

И еще… получается что лучше избегать прямых запросов типа SELECT * FROM table WHERE id = 1 и использовать встроенные методы ?

Да, но на самом деле связать таблицы на уровне БД тоже не помешает, т.к.:

  1. добавляется автоматическая поддержка целостности на уровне БД;

  2. генератор моделей Yii по существующим связям сам вставит нужный код в relations().

Да, сохранять связанную информацию придется вручную. Но в вашем случае, скорее всего, этого и не потребуется, ведь типы товаров добавляются отдельно, а товары отдельно? Чуть сложнее будет код контроллера, если можно добавить товар и сразу же несколько новых типов.

Намного лучше и удобнее (уж извините, что не аргументирую, но “за” действительно очень много :) ). Писать SQL возможно придется только в двух случаях: 1) архисложный запрос с кучей вложенных select’ов или операторами, специфичными для конкретной СУБД, 2) оптимизация (это вовсе не значит, что приложение станет работать заметно быстрее, если всё писать на “чистом” SQL).