0

Extbase 中使用的“in”属性似乎对我不起作用。

$actor包含一个数组Actor model objects。我的Movie modelActor是 m:n 的关系。

我在我的Movie Repository

$query=$this->createQuery();
$query->matching($query->in('actors',$actors));
$result = $query->execute()->toArray();

$result正在显示NULL

我也尝试过传递数组,actor uids但这也行不通:

$query->matching($query->in('actors',[$actor_1_uid,$actor_2_uid]));

当然有,contains但使用in应该更方便。

4

2 回答 2

3

我认为你的陈述没有任何问题。为了清楚起见,必须将“in”语句放在匹配语句中的某个位置,这在您的情况下是正确的。

但是,您应该将您的创建查询更改为

$query = $this->createQuery();

代替

$query=$this->create->query();

如果仍然没有结果,我建议你检查extbase执行的SQL语句,在TYPO3中有一个棘手的方法。

您必须在核心中找到以下文件:/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php

找到 replacePlaceHolders 函数并在函数末尾添加以下代码:

if (strpos( $sqlString, "my_table_name" ) !== false) {
echo $sqlString;
}

我将回显为以下“my_table_name”表所做的每条语句。当然,永远不要在您的生产服务器中这样做。

我希望它会有所帮助!干杯,奥利维尔

于 2013-08-05T00:11:36.977 回答
2

对不起,但$query->in方法不对。AFAIK 它不适用于 m:n 反应,仅适用于 1:n。

尝试这样的事情,$actors是来自模型或参与者存储库的查询结果:

$constraints = array();
foreach ($actors as $actor) {
  $constraints[] = $query->contains('actors', $actor->getUid());
}

if (!empty($constraints)) {
  $result = $query->matching($query->logicalOr($constraints))->execute();
}

当然你可以使用你自己的 uid 数组进行循环,然后直接删除getUid()方法

于 2013-08-04T20:46:44.470 回答