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

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

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

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

Q&A

解決済

1回答

723閲覧

CakePHP3でNOT INの書き方について

ssk

総合スコア332

CakePHP

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

0グッド

0クリップ

投稿2017/08/24 15:37

###前提・実現したいこと
CakePHP3とMySQLを使って
複数カラムに対して指定のキーワードを除外した検索を行いたいです。

idclumn01clumn02clumn03
1鈴木バイト時給
2田代正社員固定給
3佐々木正社員固定給+歩合

###発生している問題・エラーメッセージ
以下のSQL文だと、当たり前ですが
ORにしているため、全てのレコードが検索にヒットします。

SQL

1clumn01 not in ('固定給') 2OR clumn02 not in ('固定給') 3OR clumn03 not in ('固定給')

フリーワード除外検索を実装しているため
clumn03のみ対象にすることはできません。

###試したこと
以下のSQLをMySQLから実行したところ
id 2のデータだけとることができました。

しかし、CakePHPで以下のSQL文を発行するコードが生成できず困っています。

SQL文

1clumn01 || clumn02 || clumn03 not in ('固定給')

他にもSQL文の書き方がありましたら、教えていただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

複数カラムに対して指定のキーワードを除外した行の検索であれば、それぞれのカラムに対しての条件をANDで繋げればよいのではないでしょうか
clumn01 not in ('固定給') AND clumn02 not in ('固定給') AND clumn03

CakePHP3のマニュアルを見る限りでは多分こんな感じでしょうか
CakePHP3 クエリービルダー

$query = $cities->find() ->where(function ($exp, $q) { return $exp->notIn('clumn01', ['固定給']); })->andWhere(function ($exp, $q) { return $exp->notIn('clumn02', ['固定給']); })->andWhere(function ($exp, $q) { return $exp->notIn('clumn03', ['固定給']); });

投稿2017/08/24 15:43

編集2017/08/24 15:46
aro10

総合スコア4106

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

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

ssk

2017/08/24 15:46

ありがとうございます。 ANDで繋げますと件数が多いからか15秒程、ウエイトがかかってしまうためANDでの実装は難しいです。
aro10

2017/08/24 16:03 編集

clumn01 || clumn02 || clumn03 not in ('固定給') で動くSQLができてるのであれば、CakePHP3でConnectionManagerを使って素のSQLを実行方法を使うとできるかと思います。 [データベースの基本](https://book.cakephp.org/3.0/ja/orm/database-basics.html) ``` $connection = ConnectionManager::get('default'); $results = $connection->execute('SELECT * FROM articles')->fetchAll('assoc'); #プレースホルダーもいけるみたいです $stmt = $conn->execute('UPDATE posts SET published = ? WHERE id = ?', [1, 2]); ``` 速度的にはわかりませんが、こんな感じにまとめることもできるかと思います ``` SELECT * FROM test WHERE NOT FIND_IN_SET('固定給',CONCAT(clumn01,',',clumn02,',',clumn03)); ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問