これまではcakephp2.xしか使ったことがない私は、最近cakephp3を使ってみました。ORMがかなり改善されたそうです。その中のいくつかを見てみます。
#新しいfind
find('first')がfirst( )に
findfirst.php
// 2.x, 1.x
$article = $this->Article->find('first');
// 3.x
$article = $this->Articles->find()->first();
get($pk)に
findById($id)のようなget($pk)、primarykeyでクエリーします。
getByPk.php
// 3.x
$article = $this->Articles->get(10);
#findのreturn
cakephp2.xでは、findから返してきたのは配列の結果です。
cakephp2x
$this->loadModel('Article');
$article = $this->Article->find('first');
pr($article);
/*
Array
(
[Article] => Array
(
[id] => 1
[title] => 'My Article Title'
...
)
)
*/
cakephp3では、findがクゥエリーオブジェクトを返します。
データをそのクエリーオブジェクトから求めます。
cakephp3
$articles = TableRegistry::get('Articles');
$query = $articles->find();
echo $query;
//SELECT Articles.id AS `Articles__id`, Articles.title AS `Articles__title`, ... FROM articles Articles
echo $query->first();
//{ "id": 1, "title": "My Article Title", ... }
Model名は複数英単語になりました。
クゥエリーオブジェクトを返すことで色々なことが便利になりました。
#条件をfind後でも修正可能
alterqueries.php
$articles = TableRegistry::get('Articles');
$query = $articles->find();
$query->where(['author_id' => 1])->order(['title' => 'DESC']);
#subquery
サブクエリーが簡単になりました。
subquery.php
$articles = TableRegistry::get('Articles');
$query = $articles->find();
$trends = TableRegistry::get('Trends');
//subquery
$trendQuery = $trends->find('all')->select(['category_name'])->where(['click >' => 100]);
$query->where(['category IN'=>$trendQuery]);
subquery2.php
$query = $articles->find('approved'); //カスタムfunction findApprovedをArticlesTable.phpで設定した前提。
$favoritesQuery = $article->find('favorites', ['for' => $user]);
$query->where(['id' => $favoritesQuery->select(['id'])]);
#contain
cakephp3前のバージョンは、containを使う時recursive
=-1
にしてContainableBehaviorやModelの組み合わせなどを設定します。cakephp3ではそれをなくしcontain()
だけで実現できます。
contain.php
$query = $this->Articles->find('all')->contain(['Authors']);
今日はここまでにします。