zf2以降、Zend \ Dbを使用したクエリでは、orWhereは使用できなくなりました(ZF2 How to orWhere())。これを置き換えることができます。私の例では、「like」はなく、次のようなクエリのみがあります。
$select->where("....")->orWhere("...")
PredicateSetを使用することが唯一の方法である場合、それを使用してクエリを作成するにはどうすればよいですか?
zf2以降、Zend \ Dbを使用したクエリでは、orWhereは使用できなくなりました(ZF2 How to orWhere())。これを置き換えることができます。私の例では、「like」はなく、次のようなクエリのみがあります。
$select->where("....")->orWhere("...")
PredicateSetを使用することが唯一の方法である場合、それを使用してクエリを作成するにはどうすればよいですか?
最も簡単な方法は、流暢な表記法を使用することです。
$where = new Zend\Db\Sql\Where;
$where->OR->equalTo('id', $id);
疑問がある場合は、ラルフがZend_Db-Examplesリポジトリ(https://github.com/ralphschindler/Zend_Db-Examples)に投稿した例を確認してください。
orPredicateは、次のようにWhere()に対して使用できます。
public function fetchLike($keyword)
{
$where = new \Zend\Db\Sql\Where();
$pred_url = new \Zend\Db\Sql\Predicate\Like('url', '%' . $keyword . '%');
$pred_notes = new \Zend\Db\Sql\Predicate\Like('notes', '%' . $keyword . '%');
$pred_username = new \Zend\Db\Sql\Predicate\Like('username', '%' . $keyword . '%');
$where->orPredicate($pred_url)->orPredicate($pred_notes)->orPredicate($pred_username);
$resultSet = $this->tableGateway->select($where);
return $resultSet;
}
もちろん、私が使用したような述語の代わりに、 lessThanOrEqualTo、equalToなどの述語を使用できます。orPredicateの代わりにandPredicateを使用することもできます。
述語に関するZF2の情報については、ここをクリックしてください
また、名前空間を適切な方法で使用することをお勧めします。
use \Zend\Db\Sql\Predicate\Like;
use \Zend\Db\Sql\Where;
// Now you can use code like this:
$pred_url = new Like('url', '%' . $keyword . '%');
// Instead of
$pred_url = new \Zend\Db\Sql\Predicate\Like('url', '%' . $keyword . '%');
これは現在、orPredicate()
「内のコードを参照」と呼ばれていますZend\Db\Sql\Predicate\Predicate.php
関数については、Zend \ Db \ Sql \ Selectのドキュメントも参照してください。この関数は、またはwhere()
の組み合わせを定義する2番目のパラメーターを渡すことができます。AND
OR
たとえば、LIKEを使用しない場合は、次のように実行できます(自分で解決策をかなり探していました)。
$select->where(
array(
new \Zend\Db\Sql\Predicate\PredicateSet(array(
new \Zend\Db\Sql\Predicate\Operator('first_column', \Zend\Db\Sql\Predicate\Operator::OPERATOR_EQUAL_TO, $some_value),
new \Zend\Db\Sql\Predicate\Operator('second_column', \Zend\Db\Sql\Predicate\Operator::OPERATOR_EQUAL_TO, $some_value)
/* even more columns to compare this way... */
),
\Zend\Db\Sql\Predicate\PredicateSet::COMBINED_BY_OR)
)
);