40
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CakePHP 3Advent Calendar 2015

Day 18

Cakephp3のORMでfindが変わった。

Posted at

これまでは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']);

今日はここまでにします。

40
44
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?