0

PropelORM では、別の ModelCritera オブジェクトをパラメーターとして IN 句を追加できますか?

私は成功せずに次のことを試みていました:

$oAuthorQ = new AuthorQuery(); 
$oAuthorQ->filterByLastName('Smith'); 


$oBookQ = new BookQuery();
$oBookQ->where('Book.Author IN ? ', $oAuthorQ);
...

エラーを受け取りました:

PHP Fatal error:  Nesting level too deep - recursive dependency? 

私の仮定は、クエリの構造化で何か間違ったことをしているだけです-探しているものを達成する方法はありますか?

4

2 に答える 2

0

Propel でこれを行う最善の方法は確かではありませんが、最近私が行った方法は、ID のみを取得するために最初のクエリで選択を使用して、2 つの別々のクエリを実行することでした。このクエリは、2 番目のクエリに渡すことができる ID の配列を返します。単一の DB 呼び出しよりも効率的ではありませんが、コードは非常に読みやすいです (これは、いくつかのコードを回答に入れる最初の試みです)。

これは、私がたまたま自分のコードベースで作業していた場所からの簡単なテスト済みの例です。

$posts = PostsQuery::create()->select('Id')->filterByDeleted(ACTIVE_RECORD)->filterByPostTypeId($postType->getId())->limit(5)->find()->toArray();


$posts2 = PostsQuery::create()->filterById($posts)->find();

最初のオブジェクト ($posts) は次のとおりです。

array(5) {\n  [0]=>\n  string(3) "374"\n  [1]=>\n  string(3) "375"\n  [2]=>\n  string(3) "376"\n  [3]=>\n  string(3) "377"\n  [4]=>\n  string(3) "378"\n}\n

...そして 2 番目は完全な 5 行です。

これは単純化された例であり、元はページ分割されたクエリであったことに対する免責事項:

$posts = CmsPostsQuery::create()->filterByDeleted(ACTIVE_RECORD)->filterByPostTypeId($postType->getId())->paginate($pageNum,10);

私はあなたのためのより良い答えに出くわしました: 本当に複雑なクエリのためのORMソリューション

于 2012-04-24T16:49:14.707 に答える
0

ここは必要ないと思いますwhere in

$oBookQ = BookQuery::create()
  ->useAuthorQuery()
    ->filterByLastName('Smith')
  ->endUse()
  ->find();

しかし、クエリは本と著者のように単純ですか、それとも問題はより複雑ですか?

于 2012-04-11T07:19:28.717 に答える