兽人教义的问题
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);
我有类似的东西:
$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);