带有ModelCriteria对象参数的PropelORM IN子句

时间:2012-04-11 03:54:23

标签: php propel

使用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? 

我的假设是我在构建查询时做错了 - 有没有办法实现我想要的东西?

2 个答案:

答案 0 :(得分:0)

我认为你不需要where in

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

但您的查询是否与书籍和作者一样简单,或者问题更复杂?

答案 1 :(得分:0)

我不确定使用Propel执行此操作的最佳方法,但我最近做的一种方法是执行2个单独的查询,使用第一个上的选择仅获取Id。此查询返回一个Id数组,然后可以将其传递给第二个查询。它的效率低于单个数据库调用,但代码很容易阅读(请耐心等待,这是我第一次尝试将一些代码转化为答案)

以下是我在我自己的代码库中工作的位置的快速测试示例:

$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

......第二个是完整的5行。

免责声明这是一个简单的例子,最初只是一个分页查询:

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

我偶然发现了一个更好的答案: ORM Solution for really complex queries