使用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?
我的假设是我在构建查询时做错了 - 有没有办法实现我想要的东西?
答案 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