使用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?
我的假设是我只是在构建查询时做错了什么 - 有没有办法实现我正在寻找的东西?
我认为你不需要在这里where in
。
$oBookQ = BookQuery::create()
->useAuthorQuery()
->filterByLastName('Smith')
->endUse()
->find();
但是,您的查询是像书籍和作者一样简单,还是问题更复杂?
我不确定使用 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解决方案