Код: Выделить всё
class Something extends CActiveRecord
Как правильно оформить код в Model если используешь DAO?
Спасибо.
Тема переросла в полноценный рецепт:
http://yiiframework.ru/doc/cookbook/ru/model.dao
Код: Выделить всё
class Something extends CActiveRecord
Код: Выделить всё
class Something extends CModel
Код: Выделить всё
class Film extends CModel {
public $id;
public $name;
public $comments; //коллекция комментариев
public function rules() {
return array(
array('name', 'required'),
array('name', 'length', 'max'=>255),
);
}
public function getName()
{
return $this->name;
}
public function getId()
{
return $this->id;
}
public function setName($newName)
{
$this->name = $newName;
}
public function getComments()
{
return $this->comments;
}
}
Код: Выделить всё
class FilmManager {
/**
*
* @param int $id
* @return Film
*/
public static function getFilmById($id) {
$db = Yii::app()->db;
$film_table = Film::tableName();
$sql = "SELECT * FROM {$film_table} WHERE id=:ID LIMIT 1";
$command=$db->createCommand($sql);
$command->bindParam(":ID", $id);
$row = $command->queryRow();
$film = new Film;
$film->id = $row['id'];
$film->name = $row['name'];
//получаем комментарии для фильма
$film->comments = CommentsManager::getCommentsForFilm( $row['id']);
return $film;
}
/**
*
* @param string $year
* @return array массив объектов Film
*/
public static function getFilmByYear($year) {
$cl = new SphinxClient ();
$cl->SetServer ( 'localhost', 3312 );
$cl->SetConnectTimeout ( 1 );
$cl->SetArrayResult ( true );
$cl->SetMatchMode ( SPH_MATCH_ALL );
$cl->SetFilter("year",$year);
$res = $cl->Query ( $search, "filmIndex" );
$ids = array();
foreach($res['matches'] as $match) {
array_push($ids, $match['id']);
}
$db = Yii::app()->db;
$film_table = Film::tableName();
$sql = "SELECT * FROM {$film_table} WHERE id IN (:IDS)";
$command=$db->createCommand($sql);
$command->bindParam(":IDS", implode(',',$ids));
$rows = $command->queryAll();
$films = array();
foreach($rows as $row) {
$film = new Film;
$film->id = $row['id'];
$film->name_ru = $row['name_ru'];
array_push($films, $film);
}
return $films;
}
}
Код: Выделить всё
$film = FilmManager::getFilmById(1);
echo $film->getName();
foreach($film->getComments() as $comment)
{
echo $comment->getText();
echo $comment->getAuthor()->getName();
}
Код: Выделить всё
class FilmCollection extends CList {
private $totalCount; //общее число фильмов, без установленных лимитов
public function add($item)
{
if(!($item instanceof Film))
throw new CException('ээ, что такое вы в меня суете, я принимаю только объекты типа Film');
parent::add($item);
}
public function setTotal($count)
{
$this->totalCount = $count;
}
public function getTotal()
{
return $this->totalCount;
}
}
Код: Выделить всё
/**
*
* @param string $director
* @param int $limit
* @param int $offset
* @return FilmCollection
*/
public function getFilmsByDirector($director, $limit, $offset) {
$db = Yii::app()->db;
$film_table = Film::tableName();
$sql = "SELECT * FROM {$film_table} WHERE director = :Director
LIMIT :Offset, :Limit";
$command=$db->createCommand($sql);
$command->bindParam(":Director", $director);
$command->bindParam(":Limit", $limit);
$command->bindParam(":Offset", $offset);
$rows = $command->queryAll();
$filmCollection = new FilmCollection;
foreach($rows as $row) {
$film = new Film;
$film->id = $row['id'];
$film->name = $row['name'];
$filmCollection->add($film);
}
//считаем фильмы без лимитов
$sqlForCount = "SELECT COUNT(*) FROM {$film_table} WHERE director = :Director";
$command2=$db->createCommand($sqlForCount;
$command2->bindParam(":Director", $director);
$count = $command2->queryScalar();
$filmCollection->setTotal($count);
return $filmCollection;
}
Код: Выделить всё
class Film extends CModel
{
protected $isNewrecord;
protected $id;
protected $name;
public __construct($isNew=true)
{
$this->isNewRecord=$isNew;
}
public function save(){
if($this->isNewRecord){
//новая
}else{
//Измененая
}
}
public static function findById($id)
{
$data=$sphinx->find(array('id'=>$id));
$model=new __CLASS__(false);
$model->attributes=$data;
return $model;
}
public function behaviors(){
return array(
'list'=>'CList',
);
}
}
Поддерживаю, действительно хорошо написано.Sam Dark писал(а):По-моему очень хороший вариант для тех, кому по каким-либо причинам не подходит AR. В рецепты поместить однозначно стоит.
Код: Выделить всё
class FilmManager {
public function __construct()
{
}
public static function factory($driver = 'DB')
{
return new 'Film'.$driver.'Manager';
}
/**
*
* @param int $id
* @return Film
*/
public function getFilmById($id) {
}
}
Код: Выделить всё
class FilmDBManager extends FilmManager {
public function getFilmById($id) {
$db = Yii::app()->db;
$film_table = Film::tableName();
$sql = "SELECT * FROM {$film_table} WHERE id=:ID LIMIT 1";
$command=$db->createCommand($sql);
$command->bindParam(":ID", $id);
$row = $command->queryRow();
$film = new Film;
$film->id = $row['id'];
$film->name_ru = $row['name_ru'];
//получаем комментарии для фильма
$film->comments = CommentsManager::getCommentsForFilm($id);
return $film;
}
}
Код: Выделить всё
class FilmXMLManager extends FilmManager {
public function getFilmById($id) {
//берем из xml данные, создаем инстанс Film
return $film;
}
}
Код: Выделить всё
//из бд берем данные
$film = FilmManager::factory()->getFilmById($id);
//а тут решили из xml
$film = FilmManager::factory('XML')->getFilmById($id);