【问题标题】:Problems with orx doctrineorx学说的问题
【发布时间】:2017-07-19 10:27:18
【问题描述】:

我有类似的东西:

$languages = ["English", "German", "Spanish"];

工作实体:

/**
 * @Flow\Entity
 */
class Job {
    /**
     * The name of first language for the job (M:1 unidirectional)
     *
     * @var \PATH\Language
     * @ORM\ManyToOne
     */
    protected $language1;

    /**
     * The name of second language for the job (M:1 unidirectional)
     *
     * @var \PATH\Language
     * @ORM\ManyToOne
     */
    protected $language2;
}

和语言实体:

/**
 * @Flow\Entity
 */
class Language
{

    /**
     * The language name
     *
     * @var string
     * @Flow\Identity
     * @Flow\Validate(type="Text")
     * @Flow\Validate(type="NotEmpty")
     * @Flow\Validate(type="StringLength", options={ "minimum"=1, "maximum"=80})
     * @ORM\Column(length=80)
     */
    protected $name;
}

如何在 $languages 中获得所有具有语言 1 或语言 2 的工作? 我尝试了以下方法,但它不起作用...

我得到空结果。

$queryBuilder
            ->resetDQLParts()
            ->select("job")
            ->from("Job", "job")
            ->andWhere(
                $queryBuilder->expr()->orX(
                        $queryBuilder
                            ->innerJoin('job.language1', 'language1')
                            ->andWhere($queryBuilder->expr()->in("language1.name", $languages)),
                        $queryBuilder
                            ->innerJoin('job.language2', 'language2')
                            ->andWhere($queryBuilder->expr()->in("language2.name", $languages))
                )
            );

有什么想法吗?

【问题讨论】:

  • 有什么不好的?尝试通过在末尾使用 ->getSQL() 并回显它来打印 SQL 以查看不正确的地方。
  • 无法执行 var_dump,因为它是通过 ajax 调用的
  • 当然可以,死(var_dump($var));并检查来自 ajax 请求的 f12 开发工具响应。
  • 我确实明白了 >>> 在此上下文中不允许使用“Doctrine\ORM\QueryBuilder”类型的表达式。异常代码 0 异常类型 InvalidArgumentException 在文件 Packages/Libraries/doctrine/orm/lib/Doctrine/ORM/Query/Expr/Base.php 第 95 行抛出
  • 我仍然不确定问题出在哪里。不,可能没有必要。

标签: php doctrine-orm typo3-flow


【解决方案1】:

我不完全理解您编写的查询,这肯定不是我过去使用 QueryBuilder 的方式。我已经重写了它的使用方式。

语言字段没有说明他们引用的实体应该是:

/** @ORM\ManyToOne(targetEntity='AppBundle\Entity\Language')

假设表结构为:

ID | Job Name | Language1 | Language2
1  | Job1     | French    | English
2  | Job2     | English   | Spanish

SQL 将是:

SELECT * FROM `jobs` 
     WHERE `language1` IN ("English", "French") 
     OR    `language2` IN ("English", "French");

翻译为:

$this->createQueryBuilder('job')            
        ->where('job.language1 IN (:languages)')
        ->orWhere('job.language2 IN (:languages)')
        ->setParameter("languages", $languages)
        ->getQuery()
        ->getResult();

但是表结构为:

-- Jobs
ID | Job Name | Language1 | Language2
1  | Job1     | 1         | 2
2  | Job2     | 2         | 3

-- Languages
ID | Language
1  | French
2  | English
3  | Spanish

你需要这样的东西:

$this->createQueryBuilder('job')
        ->leftJoin('job.language1', 'language1')
        ->leftJoin('job.language2', 'language2')
        ->where('language1.language IN (:languages)')
        ->orWhere('language2.language IN (:languages)')
        ->setParameter("languages", $languages)
        ->getQuery()
        ->getResult();

【讨论】:

  • 感谢 Doug 的帮助,但我还没有让它工作。
  • @Tiero 什么没用?您应该提供实体的相关部分,包括加入 yaml 或注释,以便我们可以看到您实际尝试执行的操作。
  • 工作实体在问题中。
  • 好的,语言实体现在在问题中。
【解决方案2】:

我也遇到了不同的问题,这就是 Dougs 解决方案对我不起作用的原因。在解决了这个问题并在他的解决方案的帮助下,我想出了这个:

    $queryBuilder
        ->leftJoin('Path\Language', 'language1', JOIN::LEFT_JOIN,  "job.language1 = language1")
        ->leftJoin('Path\Language', 'language2', JOIN::LEFT_JOIN,  "job.language2 = language2")
        ->andWhere(
            $queryBuilder->expr()->orX(
                $queryBuilder->expr()->in("language1.name", ":languages"),
                $queryBuilder->expr()->in("language2.name", ":languages")
            )
        )->setParameter("languages", $languages);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-28
    • 2021-07-28
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2014-12-19
    • 2011-06-01
    相关资源
    最近更新 更多