работа с базой данных

Собственно может ли ктонибуть составить пример скажем на такой пример:



//Быдлокод


public function getPosts( $catid, $page=1 )


{


    $data = db::getData("SELECT * FROM table WHERE `cid` = {$catid} LIMIT ".(($page-1)*10).", 10");


}


ибо я пока непонимаю как работать с AR.

Вот что-то вроде этого:



public function getPosts( $catid, $page=1 )


{


    $limit = ($page-1)*10;


    $sql = "SELECT * FROM `table` WHERE `cid` = :catid LIMIT :limit, 10";


    $command = Yii::app()->db->createCommand($sql);


    $command->bindParam(":catid", $catid, PDO::PARAM_INT);


    $command->bindParam(":limit", $limit, PDO::PARAM_INT);


    $data = $command->queryAll();


}


Вместо названия таблицы table можно написать что-то вроде. Model::tableName(). Где Model - это название класса модели данных.

Как это будет, используя ActiveRecord.

Пишем в контроллере:



<?php


private function getPosts($catid, $page=1){


    $criteria = new CDbCriteria; // объект критериев выборки из БД


    


    // Объект пагинации и кол-во постов


    $pages = new CPagination(Post::model()->count($criteria));





    $pages->pageSize = 20; // Кол-во постов на страницу


    $pages->applyLimit($criteria); // Прикручиваем к запросу наши критерии





    // Вся магия здесь:


    $posts = Post::model()->findAll($criteria);


}


То есть нам не надо будет вычислять пределы для LIMIT, исходя из номера страницы и кол-ва постов на каждой. Все это сделает за нас фреймворк.

Спасибо) это именно то что я и хотел узнать. Правда я еще неразобрался как в AR делать LEFTJOIN но это уже сам…

В модели прописываешь связи в relations()

а потом используешь запрос типа

Post::model()->with('authors')->findAll()

или

Post::model()->with('authors')->together(false)->findAll()

Active Record замечательная вещь и вроде бы упрощает жись, но

я столкнулся с такой проблемой: допустим в таблице есть 3 поля

на разных языках nameRU, nameEN, …  так вот, код типа

[tt]$criteria = new CDbCriteria;

$criteria->select = 'nameRU as name';[/tt]

выдает сообщение об ошибке. поэтому формирую SQL-заросы по

старинке:

[tt]$sql = "select nameRU as name from …";

$rows = Yii::app()->db->createCommand($sql)->query()->readAll();

[/tt]

… а может я по своей наивности не разобрался с как Yii организована

работа транслятора на разных языках?  ???

А вот, что пишут в документации:

Quote

Примечание: AR не дает решения для всех задач, касающихся работы с базами данных. Лучше всего его использовать для моделирования таблиц в конструкциях PHP и для несложных SQL-запросов. Для сложных случаев следует использовать Yii DAO.

Quote

Active Record замечательная вещь и вроде бы упрощает жись, но

я столкнулся с такой проблемой: допустим в таблице есть 3 поля

на разных языках nameRU, nameEN, …   так вот, код типа

[tt]$criteria = new CDbCriteria;

$criteria->select = 'nameRU as name';[/tt]

выдает сообщение об ошибке. поэтому формирую SQL-заросы по

старинке:

[tt]$sql = "select nameRU as name from …";

$rows = Yii::app()->db->createCommand($sql)->query()->readAll();

[/tt]

… а может я по своей наивности не разобрался с как Yii организована

работа транслятора на разных языках?  ???

Разве не поддерживаются алиасы?

вот где собака порыта:

[tt]class News extends CActiveRecord

{

  …

  … 

public function rules()


{


	return array(


		array(&#039;titleEN&#039;,&#039;length&#039;,&#039;max&#039;=&gt;150),


		array(&#039;titleRU&#039;,&#039;length&#039;,&#039;max&#039;=&gt;240),


		array(&#039;titleES&#039;,&#039;length&#039;,&#039;max&#039;=&gt;150),


		array(&#039;dat&#039;, &#039;required&#039;),


	);


}

  …

  …

}[/tt]

РЕЗЮМЕ:  ActiveRecord дивно годится  для

insert, update, а для выборки данных (select)

следует использовать Data Access Objects (DAO)

Quote

РЕЗЮМЕ:  ActiveRecord дивно годится  для

insert, update, а для выборки данных (select)

следует использовать Data Access Objects (DAO)

так это и правильно

sql может джойнить с десяток таблиц, AR загнется нафиг, нетивом нужно писать

Ну на самом деле не обязательно что джоин из 10 таблиц будет работать быстрее. Скорее как раз наоборот. В случае с 2-3 - это да. Но фишка в том, что надо просто учитывать, что важнее в ДАННОМ запросе - скорость работы или скорость разработки.

У меня в проекте делается сложный поиск. Понятное дело, что через актив рекорд я его не делаю, но через 5 джоинов - тоже неправильно. Самый эффективный вариант оказался искать ID продуктов, а потом выбирать через IN(). AR делает точно так же.

ИТОГО: Если таблицы большие (больше 50 000 записей), а объединений больше 3х, то при включенном кешировании схемы таблицы AR не будет отставать от джоинов, зато будет давать большее удобство.