PropelORM IN 子句与 ModelCriteria 对象参数


PropelORM IN Clauses with ModelCriteria Object Parameter

使用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解决方案