兽人教义的问题

Problems with orx doctrine

我有类似的东西:

$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))
                )
            );

有什么想法吗?

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

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

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

假设 table 结构为:

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();

但是 table 结构为:

-- 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();

我也有一个不同的问题,这就是 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);