2016-06-20 5 views
1

との句では、私は、このような配列から始まるこのクエリビルダは:複合列

... 
WHERE 
(order_date, order_number) IN (
    ('2016-03-11', 3455453), 
    ('2016-03-18', 83545454), 
    ('2016-06-17', 5354544) 
) 

のように、複数のカラム上の条件で作成する必要があります。

$orders = [ 
    ['2016-03-11', 3455453], 
    ['2016-03-18', 83545454], 
    ['2016-06-17', 5354544] 
]; 

cake3クエリビルダを使用しました。私は

->where(['(order_date, order_number) IN' => $orders]); 

てみましたが、私はエラーを取得:

Cannot convert value to string

私はそれが手動で配列を操作するクエリを作成することは難しいことではありません知っているが、ケーキの方法がある場合、私は知りたいのですがそれをするために。このAFAICT

+0

[構文で有効な]あなたが何をしようとしてです(http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html #function_in)?私はあなたが 'OR'を探していると思う。 – AD7six

+0

ああ、 'INは行のコンストラクタを比較するのに使うことができます:' hehは決してそれを知り/読んでいません。私はそれを行う方法で構築されることを期待していない、それは一般的な使用法ではない(少なくともIME)。 – AD7six

+0

私はそれが有効なIN構文だと思います。実際、このマニュアルでは_INを使用して行のコンストラクタを比較できると述べています。また、私のアプリケーションでも動作します(たとえ、常に_works_が_itのvalid_を意味するわけではないことに同意しても)。もちろん私は同等のOR節で置き換えることができますが、INは私の意見ではよりコンパクトに見えます – arilia

答えて

4

Source > \Cake\Database\Expression\Comparison::_stringExpression()

しかし、これは参照配列構文または正規比較式、単一フィールド及びフラットアレイを扱う変換を担当するコードを使用して(まだ)は不可能ですタプルの比較式を使用することで可能です。これは、ボックスの外にあるタプルのセットを処理することをサポートします。内部的には、複合キーを処理するための関連によって使用されます。

use Cake\Database\Expression\TupleComparison; 

// ... 

$fields = ['order_date', 'order_number']; 
$types = ['date', 'integer']; 

$query->where(
    new TupleComparison($fields, $orders, $types, 'IN') 
); 

Source > \Cake\Database\Expression\TupleComparison

+0

それは素晴らしいです!ありがとう – arilia