Yii Framework Forum: работа с базой данных - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

работа с базой данных Rate Topic: -----

#1 User is offline   Fesor 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 02-March 09
  • Location:Belarus, Minsk

Posted 04 March 2009 - 02:18 PM

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


//Быдлокод
public function getPosts( $catid, $page=1 )
{
    $data = db::getData("SELECT * FROM table WHERE `cid` = {$catid} LIMIT ".(($page-1)*10).", 10");
}


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

#2 User is offline   rosko 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 211
  • Joined: 04-January 09
  • Location:Kiev, Ukraine

Posted 04 March 2009 - 02:43 PM

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


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 - это название класса модели данных.
0

#3 User is offline   Darmen 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 68
  • Joined: 28-February 09
  • Location:Astana, Kazakhstan

Posted 05 March 2009 - 11:49 PM

Как это будет, используя 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, исходя из номера страницы и кол-ва постов на каждой. Все это сделает за нас фреймворк.
0

#4 User is offline   Fesor 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 02-March 09
  • Location:Belarus, Minsk

Posted 10 March 2009 - 02:36 AM

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

#5 User is offline   rosko 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 211
  • Joined: 04-January 09
  • Location:Kiev, Ukraine

Posted 10 March 2009 - 08:00 AM

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

а потом используешь запрос типа
Post::model()->with('authors')->findAll()
или
Post::model()->with('authors')->together(false)->findAll()
0

#6 User is offline   carat 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 60
  • Joined: 12-February 09

Posted 11 March 2009 - 06:18 PM

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 организована
работа транслятора на разных языках?  ???
0

#7 User is offline   rosko 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 211
  • Joined: 04-January 09
  • Location:Kiev, Ukraine

Posted 12 March 2009 - 07:29 AM

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

Quote

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

0

#8 User is offline   Darmen 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 68
  • Joined: 28-February 09
  • Location:Astana, Kazakhstan

Posted 12 March 2009 - 10:54 AM

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 организована

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


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

#9 User is offline   carat 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 60
  • Joined: 12-February 09

Posted 12 March 2009 - 05:02 PM

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

[tt]class News extends CActiveRecord
{
  ....
  .... 
public function rules()
{
return array(
array('titleEN','length','max'=>150),
array('titleRU','length','max'=>240),
array('titleES','length','max'=>150),
array('dat', 'required'),
);
}
  ....
  ....
}[/tt]
0

#10 User is offline   carat 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 60
  • Joined: 12-February 09

Posted 13 March 2009 - 01:00 PM

РЕЗЮМЕ:  ActiveRecord дивно годится  для
insert, update, а для выборки данных (select)
следует использовать Data Access Objects (DAO)
0

#11 User is offline   maks 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 14
  • Joined: 01-February 09

Posted 13 March 2009 - 05:57 PM

Quote

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

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

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

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

#12 User is offline   KJedi 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 381
  • Joined: 19-October 08
  • Location:Nikolaev, Ukraine (Europe)

Posted 16 March 2009 - 12:53 AM

Ну на самом деле не обязательно что джоин из 10 таблиц будет работать быстрее. Скорее как раз наоборот. В случае с 2-3 - это да. Но фишка в том, что надо просто учитывать, что важнее в ДАННОМ запросе - скорость работы или скорость разработки.
У меня в проекте делается сложный поиск. Понятное дело, что через актив рекорд я его не делаю, но через 5 джоинов - тоже неправильно. Самый эффективный вариант оказался искать ID продуктов, а потом выбирать через IN(). AR делает точно так же.
ИТОГО: Если таблицы большие (больше 50 000 записей), а объединений больше 3х, то при включенном кешировании схемы таблицы AR не будет отставать от джоинов, зато будет давать большее удобство.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users