web-dev-qa-db-ja.com

Laravelクエリビルダー-修正されたwhereステートメントでクエリを再利用する

私のアプリケーションは、複雑なクエリを動的に構築して実行し、レポートを生成します。場合によっては、他のすべてのパラメーターを同じにして、複数の、やや任意の日付範囲を取得する必要があります。

そのため、私のコードは、結合、場所、並べ替え、制限などの一連のクエリを作成し、クエリを実行します。次に、Builderオブジェクトにジャンプして、クエリ対象の日付範囲を定義するwhere句を変更します。

これまでのところ、日付範囲が他のwheresより先に設定されるようにしてから、wheres配列の関連する属性の値を手動で変更しようとしました。このような;

$this->data_qry->wheres[0]['value'] = $new_from_date;
$this->data_qry->wheres[1]['value'] = $new_to_date;

それから私はします(すでに一度それを行っている)

$this->data_qry->get();

動作しません。クエリは、元の日付範囲で実行されます。私のやり方がうまくいったとしても、不安定な依存症(ある種のカップリング?)で撃たれているように見えるので、私はまだそれを好きにしたくありません。すなわち;日付が最初に設定されていない場合、すべてがバラバラになります。

couldクエリ全体を最初からもう一度、異なる日付範囲で設定しますが、クエリ内の他のすべてが前回使用されたときと同じである必要があるので、それはうまくいきそうです。

これを正しい/最も近い方法で実現する方法についてのアイデアは大歓迎です。

おかげで、

ジェフ

28
Geoff Clayton

cloneを使用してクエリを複製し、異なるwhereステートメントで実行できます。最初に、from-to制約なしでクエリを作成し、次のようにします。

$query1 = $this->data_qry;
$query2 = clone $query1;

$result1 = $query1->where('from', $from1)->where('to', $to1)->get();
$result2 = $query2->where('from', $from2)->where('to', $to2)->get();
54
lukasgeiter

クローンを使用した@lukasgeiterからの提案は間違いなく進むべき道です。その理由は、Eloquent\Builderオブジェクトに、複製が必要なQuery\Builderへの内部参照が含まれているためです。

アプリのフローを維持し、より機能的なスタイルに戻すには、Laravelのwith()ヘルパーを使用できます。ヘルパーは、渡されたオブジェクトを返すだけです。

$result1 = with(clone $this->data_qry)->where('from', $from1)->where('to', $to1)->get();
$result2 = with(clone $this->data_qry)->where('from', $from2)->where('to', $to2)->get();
6
Mark Boots