gpt4 book ai didi

php - 如何使用 doctrine/symfony4 从数据库中获取(加入)两条记录

转载 作者:IT王子 更新时间:2023-10-28 23:44:01 26 4
gpt4 key购买 nike

我正在学习 Symfony 和 Doctrine 并创建了一个简单的网站,但我被困在这一步。

我有两个表:userslanguages

用户包含:id、用户名...
语言包含:user_id、语言...

这是两个 enter image description here 的图像

enter image description here

现在我正在尝试按语言获取,例如:获取同时会说 english french 的用户,结果将返回用户 ID 2

在普通 PHP 中,我可以使用 PDO 进行内部连接,但我正在尝试遵循教义语法,但这不会返回正确的结果

public function getMatchingLanguages ($a, $b) {
return $this->createQueryBuilder('u')
->andWhere('u.language = :val1 AND u.language = :val2')
->setParameter('val1', $a)
->setParameter('val2', $b)
->getQuery()
->execute();
}

我在我的 Controller 中调用此方法,并且查询非常基本,因为我找不到如何按照我的示例进行连接的文档

最佳答案

在您的用户模型中添加下一个代码:

/**
* @ORM\OneToMany(targetEntity="Language", mappedBy="user", fetch="EXTRA_LAZY")
*/
public $languages;

在您的语言模型中添加下一个代码:

/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="languages")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
* })
*/
public $user;

通过这种方式,您可以在用户和语言之间定义简单的一对多关系,但这不足以让您的用户支持两种语言。您需要对用户表和语言表进行 2 次连接。这就是它的样子(如果你使用 Controller ):

  $user = $this->get('doctrine')
->getEntityManager()
->createQueryBuilder()
->select('u')
->from(User::class, 'u')
->join('u.languages', 'l_eng', 'WITH', 'l_eng.language = :engCode')
->join('u.languages', 'l_fr', 'WITH', 'l_fr.language = :frCode')
->setParameters([
'engCode' => 'english',
'frCode' => 'french'
])
->getQuery()->execute();

或者,如果您使用 UserRepository 类(最好):

public function findAllByLangs()
{
return $this->createQueryBuilder('u')
->join('u.languages', 'l_eng', 'WITH', 'l_eng.lang = :engCode')
->join('u.languages', 'l_fr', 'WITH', 'l_fr.lang = :frCode')
->setParameters([
'engCode' => 'english',
'frCode' => 'french'
])
->getQuery()->execute();
}

所以主要技巧是加入以英语为条件的语言表来过滤支持英语的用户 AND 再次加入语言表,但在“ON”部分加入法语以过滤支持法语的用户 < strong>还有。

关于php - 如何使用 doctrine/symfony4 从数据库中获取(加入)两条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52067624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com