Doctrine & Symfony - 使用数组列上的参数从数据库获取数据
Doctrine & Symfony - Get data from database with parameter on array column
下午好,
我尝试从我的数据库中查找具有传递给查询参数的角色的特定用户。但是,我目前有 "null" 个结果。
用户 class 是这样的 example 来自 Symfony 文档。
这是我的 CustomerRepository:
class CustomerRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Customer::class);
}
public function findByRole(string $role)
{
return $this->getEntityManager()->createQuery(
'SELECT c
FROM App\Entity\Customer c
WHERE c.roles IN (:role)'
)
->setParameter(':role', $role)
->getResult()
;
}
}
我希望 return 包含一个或多个具有该角色的用户的数组。
c.roles
是一个可以包含多个项目(角色)的列表,所以请你像这样反转 where :
WHERE :role IN c.roles
PS:确保 string $role
的大小写为大写(例如 "ROLE_ADMIN")。
首先,在您给出的示例中的 class 中,没有声明名为 roles 的变量,因此您不能这样写
... WHERE c.roles IN (:role)'
所以在你的用户 class 你应该有这样的东西
private $roles;
Also as it said here you can have "multiple tables and JOIN them
in your queries."
因此您将有 1 个 table 用于所有角色,一个用于用户,另一个称为 user_roles,您将在其中存储每个用户的角色。
我打算采取的下一步是在这个新 table 中搜索我想要的用户,然后检索数组中包含不同角色的所有行。
还有其他方式 - 在需要时说明here. The method I recommend when storing arrays is to have a VARCHAR field (or TEXT) and then use (in your case) the Symfony serializer component to serialize() the array when saving in the DB and to deserialize()。
晚上好,
谢谢你的帮助。
为了解决这个问题,我考虑到一个User在应用中只有一个角色,在这种情况下,解决方案是这样的:
public function findByRole(string $role, int $isActive = 1): ?Customer
{
return $this->getEntityManager()->createQuery(
'SELECT c
FROM App\Entity\Cutomer c
WHERE c.roles LIKE :role
AND c.isActive = :isActive'
)
->setParameters([
':role' => '%'.$role.'%',
':isActive' => $isActive,
])
->getOneOrNullResult()
;
}
下午好,
我尝试从我的数据库中查找具有传递给查询参数的角色的特定用户。但是,我目前有 "null" 个结果。
用户 class 是这样的 example 来自 Symfony 文档。
这是我的 CustomerRepository:
class CustomerRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Customer::class);
}
public function findByRole(string $role)
{
return $this->getEntityManager()->createQuery(
'SELECT c
FROM App\Entity\Customer c
WHERE c.roles IN (:role)'
)
->setParameter(':role', $role)
->getResult()
;
}
}
我希望 return 包含一个或多个具有该角色的用户的数组。
c.roles
是一个可以包含多个项目(角色)的列表,所以请你像这样反转 where :
WHERE :role IN c.roles
PS:确保 string $role
的大小写为大写(例如 "ROLE_ADMIN")。
首先,在您给出的示例中的 class 中,没有声明名为 roles 的变量,因此您不能这样写
... WHERE c.roles IN (:role)'
所以在你的用户 class 你应该有这样的东西
private $roles;
Also as it said here you can have "multiple tables and JOIN them in your queries."
因此您将有 1 个 table 用于所有角色,一个用于用户,另一个称为 user_roles,您将在其中存储每个用户的角色。 我打算采取的下一步是在这个新 table 中搜索我想要的用户,然后检索数组中包含不同角色的所有行。
还有其他方式 - 在需要时说明here. The method I recommend when storing arrays is to have a VARCHAR field (or TEXT) and then use (in your case) the Symfony serializer component to serialize() the array when saving in the DB and to deserialize()。
晚上好,
谢谢你的帮助。
为了解决这个问题,我考虑到一个User在应用中只有一个角色,在这种情况下,解决方案是这样的:
public function findByRole(string $role, int $isActive = 1): ?Customer
{
return $this->getEntityManager()->createQuery(
'SELECT c
FROM App\Entity\Cutomer c
WHERE c.roles LIKE :role
AND c.isActive = :isActive'
)
->setParameters([
':role' => '%'.$role.'%',
':isActive' => $isActive,
])
->getOneOrNullResult()
;
}