公開日 2018.1.30更新日 2018.1.31カテゴリ:CakePHPタグ:PHP,CakePHP,3.5,QueryBuilder,QueryExpression,ConnectionManager
Posts hasMany Comments の関係で、最新のCommentsを3件だけ紐付けて取得したい場合を考える。 1. containに書く方法 再利用を考えなければ以下のように、containでクエリを書けばよい。 $Posts->find() ->contain([ 'Comments' => function (\Cake\ORM\Query $query) { // 最新3件 return $query->orderDesc('Comments.posted_at')->limit(3); }, 'Comments.CommentUsers', // <- コメント投稿者 ]); 2. カスタムファインダーを定義する方法 カスタムファインダーを定義することで、再利用しやすくなる。 CommentsTable に findLatest3 というカスタムファインダーを定義する
CakePHP2で、CASEやCONCATなどを使ってテーブルに存在しないフィールド名でソートを行う場合、例えば下記のようにすると思います。 <?php $params = [ 'fields' => ['CASE WHEN User.age >= 20 then 1 else 0 END AS adult'], 'order' => ['adult DESC'] ]; find('all', $params); 通常のfindであれば問題ないですが、ページングのorderでこのフィールドを指定しても効いてくれません。 このような場合は、モデルのバーチャルフィールドを利用します。 <?php //コントローラの中でUserモデルを利用 $this->User->virtualFields['adult'] = 'CASE WHEN User.age >= 20 then 1 else 0
CakePHPのShellを作っている時に実行されたSQLを見たいなーと思って調べてみました。 1行で書けるので覚えておくと便利です。 さっそくですが、SQLの実行結果を見るには、以下のように書きます。 debug($this->{Model}->getDataSource()->getLog()); getLog()が肝です。 実際の使用例 $this->User->find('all', array( 'contain' => array( 'Post' => array( 'fileds' => array( 'Post.id', 'Post.title', 'Post.body' ), 'conditions' => array( 'Post.created <=' => '2012-12-31' ), ) ), 'fileds' => array( 'User.id', 'Use
CakePHPで複数のレコードをDBに投入する時に、forループでsaveメソッドを何度も呼び出していませんか? 今のプロジェクトでもそういったソースをよく見かけるのですが、とてつもなく遅い(;´Д`) ということで、今回はCakePHPでバルクインサートを使用してインサート処理を高速に行う方法を説明します。 今回使用するテーブルは? musicsテーブル id singer song_title created modified 1 初音ミク Tell Your World 2012-09-29 20:18:57 2012-09-29 20:18:57 2 鏡音リン 炉心融解 2012-09-29 20:18:57 2012-09-29 20:18:57 3 鏡音レン Fire◎Flower 2012-09-29 20:18:57 2012-09-29 20:18:57 4 巡音ルカ J
SQLのクエリーをデバッグするには、Debug Kitを使用すればできますが、デバッグログと一緒に出したいのでやり方を調査してみました。 別々のログやビューでみるのもいいですが、秒単位で実行される処理もどちらが先に実行されたのかなどわかりやすくなるので、いいかなと個人的に思っています。 明示的に実行SQLをデバッグする モデル操作(find, save, deleteなど)の後に以下のコードを挿入すると実行SQLを(デバッグ)ログに出力させることができます。 $this->log( $this->[Model]->getDataSource()->getLog(), LOG_DEBUG); 出力先は自由に設定して下さい。 暗黙的に実行SQLをデバッグする DataSourcesをオーバーライドさせます。 MySQLの場合 1. MysqlLog.phpを作成(名前は自由に) // \app
APIやRSSなどを提供しているサイトは、情報を簡単に扱うことができますが、例えば Yahoo!の検索結果とか、mixiのニュースとか、あるサイトの一部を取り出したいことってよくあります。(とはいえ、著作権違反には注意 そんな時、PHPのライブラリである「htmlSql」を利用すると便利。このライブラリに、ファイルでもURLでも文字列でも、HTMLで作られたものなら何でも与えると、解析して取り出しやすくしてくれます。しかも、その取り出し方はSQL! 例えば、「id属性が’test’の p要素の内容を取り出したい」という場合には、次のようなSQLを使います。 SELECT text FROM p WHERE $id=="test" 超パワフル。ということで、これを CakePHPで利用するためのテクニック。 まずは、ダウンロードしたファイルの中から次のファイルを「app/vendors」フォ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く