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

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

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

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

Q&A

解決済

4回答

3387閲覧

CakePHPのfindおいて、少し複雑な条件にしたい!!

Shinog

総合スコア99

CakePHP

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

0グッド

0クリップ

投稿2015/07/15 16:03

はじめまして!

現在CakePHPのfind(all)を用いて、与えられた変数($lat,$lng)の高さ(lat)と幅(lng)に近いItemのみを取り出そうとしております。

具体的には、
$lat-1≦Item.lat≦$lat+1
かつ
$lng-1≦Item.lng≦$lng+1

に当てはまるようなItemを取り出すために、以下のようなコードを書いてみたのですが、

PHP

1$this->Item->find('all', array( 2$conditions = array('AND' => array( 3 array('Item.lat BETWEEN ? AND ?' => array($lat-1,$lat+1)), 4 array('Item.lng BETWEEN ? AND ?' => array($lng-1,$lng+1)) 5 )) 6));

上手く機能しません。

この場合、どのようなコードにすれば良いのでしょうか?
是非ともご教授のほどよろしくお願い申し上げます。

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

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

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

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

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

guest

回答4

0

ベストアンサー

はじめまして、こんにちは。

私の利用しているCakePHPはバージョン2.3.9ですので少々ことなるところもあるかもしれませんが、
'conditions'は連想配列のキーですので次のようになります。

php

1$this->Item->find('all', array( 2 'conditions' => array( 3 'Item.lat >=' => $lat - 1, 4 'Item.lat <=' => $lat + 1, 5 'Item.lng >=' => $lng - 1, 6 'Item.lng <=' => $lng + 1 , 7 ), 8));

$lat=0,$lng=100とした時、
CakePHP2.3.9では次のようなSQLが生成されます。

sql

1SELECT * FROM "public"."items" AS "Item" WHERE "Item"."lat" >= -1 AND "Item"."lat" <= 1 AND "Item"."lng" >= 99 AND "Item"."lng" <= 101

どうしてもANDを使う場合は次のような書き方になるかと思われますが抽出結果は上記と同じになります。

php

1$this->Item->find('all', array( 2 'conditions' => array( 3 'AND' => array( 4 array( 5 'Item.lat >=' => $lat - 1, 6 'Item.lat <=' => $lat + 1, 7 ), 8 array( 9 'Item.lng >=' => $lng - 1, 10 'Item.lng <=' => $lng + 1 , 11 ), 12 ), 13 ), 14));

sql

1SELECT * FROM "public"."items" AS "Item" WHERE (((("Item"."lat" >= -1) AND ("Item"."lat" <= 1))) AND ((("Item"."lng" >= 99) AND ("Item"."lng" <= 101))))

ご参考までに。

投稿2015/07/16 01:57

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Shinog

2015/07/16 03:22

ご回答ありがとうございます! 無事上記のコードで機能しました!!
退会済みユーザー

退会済みユーザー

2015/07/16 04:09

解決できたようで良かったです!
guest

0

奇をてらわず、

php

1$this->Item->find('all', array( 2 $conditions = array( 3 'Item.lat >=' => $lat - 1, 4 'Item.lat <=' => $lat + 1, 5 'Item.lng >=' => $lng - 1, 6 'Item.lng <=' => $lng + 1 7 ) 8 ) 9);

としてみてはいかがでしょうか?
もしどうしても動かない場合、実際に発行されたSQLがどうなっているかを見た方が早い場合もあります(ログなどで見たり、あえて不正な文字列をSQLに組み込んでスタックとして出力させたりする)。

投稿2015/07/16 01:34

SatoshiMashino

総合スコア210

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

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

0

パッと見は動くような気がしますが、どのように上手く機能しないのでしょうか?

投稿2015/07/15 17:31

icham

総合スコア559

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

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

0

一番シンプルなのは、

php

1$params = array( 2 'conditions' = array( 3 "ABS(Item.lat - {$lat}) <=" => 1, 4 "ABS(Item.lng - {$lng}) <=" => 1, 5 ) 6); 7$list = $this->find('all', $params);

といった書き方でしょうか。

投稿2015/07/15 16:42

terushu

総合スコア358

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問