Привет.
Вот так удобно работать с данными:
Открываем страницу /articles/, либо /articles/123, либо /articles/?date=2013-10-22
class ArticlesController extends BaseController {
# для страницы /articles/
function index ($get_params){
if ($get_params->date){
$articles = $this->Articles->find_by_date($get_params->date); // выбираем все статьи за заданную дату
} else {
$articles = $this->Articles->all(); // выбираем все статьи из таблицы
}
return compact('articles'); // этот массив пойдёт в шаблонизатор
}
# для /articles/123
function item($get_params){
if ($article = $this->Articles->find_first_by_id($get_params->id)){
return compact('article');
} else {
throw new Exception404;
}
}
}
$this->Articles вызывает __get класса BaseController, в нём ленивая загрузка, если первая буква аргумента большая — то модель создаётся на лету. Аналогично, find_by_* и find_first_by_* — обращаются к __call родительской модели и преобразуются в SELECT.
Ещё примеров.
Создать пустую запись в таблице
$this->Article->create();
но обычно создают не пустую, а с данными, потому (в контексте контроллера)
$article = $this->post('article); // массив
if ($id = $this->Articles->create($article)){
$article['id'] = $id;
}
Найти статьи и пользователей, их создавших:
$articles = $this->Articles->find_by_date('2013-04-15');
if ($authors_ids = array_map(function($article) {return $article['author_id'];}, $articles)){
$authors = $this->Authors->find_by_id(array_unique($authors_ids));
}
return compact('articles', 'authors');
В модели эти команды преобразуются в
SELECT * FROM `articles` WHERE `date`='2013-04-15'
SELECT * FROM `authors` WHERE `id` IN (1, 2, 3, 4, 5);
if ($authors_ids = ...) — проверка, не пустой ли получится массив
Чем модель отличается от датасета.
$article = array('id' => 123, 'title' => 'Зима в деревне!', 'content' => 'Однажды в студёную зимнюю пору лошадка примёрзла ...', 'date' => '2014-06-01', 'author_id' => 1);
это датасет
а
$article = new ArticleModel(array('id' => 123, 'title' => 'Зима в деревне!', 'content' => 'Однажды в студёную зимнюю пору лошадка примёрзла ...', 'date' => '2014-06-01', 'author_id' => 1))
это модель
Разница в том, что на модель можно навешать методов и юзать такой синтаксис
$articles = $this->Articles->all();
foreach ($articles as $article){
print $article->author['name'];
}
т.е. в этом случае мы прописываем классу ArticleModel метод author, который возвращает значение типа AuthorModel и т.д.
$article->author->articles; // все статьи автора, написашего данную статью.
иногда так удобнее, иногда нет. с моей точки зрения разница невелика. я пользуюсь датасетами и примерно таким синтаксисом
$articles = $this->Articles->find_by_author_id($article['author_id']);
на один запрос меньше.
— примечание: есть модель в терминологии
MVC, означает программный слой. а есть модель — как объект, соответствующий строке таблицы. я говорил про вторую. а первая модель это
$this->Articles
$this->Authors