質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

3415閲覧

カスタムFinderメソッドの例はどんなクエリを実行しているのでしょうか?

gitboku

総合スコア32

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2017/07/03 15:44

###前提
cakePHP3のカスタムFinderメソッドメソッドについて、わからないことがあったので質問しました。
コード例では以下のように書かれています。

php

1use Cake\ORM\Query; 2use Cake\ORM\Table; 3 4class ArticlesTable extends Table 5{ 6 public function findOwnedBy(Query $query, array $options) 7 { 8 $user = $options['user']; 9 return $query->where(['author_id' => $user->id]); 10 } 11} 12 13// コントローラーやテーブルのメソッド内で 14$articles = TableRegistry::get('Articles'); 15$query = $articles->find('ownedBy', ['user' => $userEntity]);

###上記コード例に対する自分の疑問
findOwnedByメソッドはどのようなクエリを実行しているのでしょうか?
一番わからないのは以下の部分です。

php

1$query = $articles->find('ownedBy', ['user' => $userEntity]);

まず"ownedBy"の意味が分かりません。
調べ方が悪いのか、リファレンスが出てきません。

どうか知恵をお貸しください、お願いします。

###現在の自分の認識
実行しているクエリ(予想)は以下の通り。
"???"の部分がわからないところです。

select ??? from articles from author_id = $options['user']->id;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

$articles->find('ownedBy', ['user' => $userEntity]);の意味ですが、find()関数の第一引数で指定したもの(ownedBy)がTableクラス側のfindOwnedByにマッピングされて、実行されます。第二引数はfindOwnedByの第二引数($options)に渡されます。

カスタムFinderを使わない場合、以下のように書くことができます。

php

1$articles->find()->where('author_id' => $userEntity->id);

※この例はわりと単純ですが、もっと複雑な条件だったり、他のfind時にも利用する条件だったりする場合にカスタムFinderを使えば共通化できます。

なお、このクエリを実行すると以下のようなSQLになると思います

SQL

1select * from articles where author_id = $userEntity->id

※$userEntity->idは実際の値が展開される
※find()->select()を指定していないので * 相当(実際はカラムが列挙されますが)

実行されたSQLについてはDebugKitのSql Logで参照できますので、実際にコードを動かして確認してみると理解が深まると思います

投稿2017/07/03 22:43

popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gitboku

2017/07/04 14:10

ありがとうございます。 確認したいことが2店あります。 1:以下の認識で問題ないでしょうか? 「ArticleTable::findOwnedBy()のインターフェースとして***->find('ownedBy',)が使えるようになる」 2:findOwnedBy()とfind('ownedBy',)のマップ関係はどうやって指定しているのでしょう…… クラス名やメソッド名がcakePHPの命名規則に従っていれば、cakePHPが勝手にうまいことやってくれるのでしょうか?
popobot

2017/07/04 19:39

> 1:以下の認識で問題ないでしょうか? > 「ArticleTable::findOwnedBy()のインターフェースとして***->find('ownedBy',)が使えるようになる」 そうです > 2:findOwnedBy()とfind('ownedBy',)のマップ関係はどうやって指定しているのでしょう…… > クラス名やメソッド名がcakePHPの命名規則に従っていれば、cakePHPが勝手にうまいことやってくれる> のでしょうか? そうです、メソッド名が命名規則に従っていれば、特に設定は必要ありません。メソッド名も自由につけることができます。find('hoge')ならfindHogeになります。 実際の処理はTableクラスのcallFinderでやっていますので、ご興味があれば見てみてください。 https://github.com/cakephp/cakephp/blob/master/src/ORM/Table.php#L2191
gitboku

2017/07/05 14:14

ありがとうございます! githubでソースが見れたのですね……知りませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問