关于在哪里放置一些逻辑和功能,我继续与Symfony斗争。
在这种情况下,我有一个简单的查询。我想知道有多少个“个人资料”取决于一个地址。
查询:
SELECT count(*)
FROM beneficiary_profile AS bp
JOIN person AS p ON bp.beneficiary_id = p.id
JOIN contact_address AS ca ON p.contact_address_id = ca.id
WHERE ca.id = 2108 -- address id
[在我的控制器中]使用实体方法执行此操作的糟糕方法是
$dependant = 0;
foreach ($address->getPeople() as $person) {
if ($person->getBeneficiaryProfile() !== null) {
$dependant++;
}
}
最后,这是一个标志,用于打印有关编辑从属地址记录的警告。
我的第一个想法是向实体$address->isDependent()
添加新方法,该方法将基于bool
返回($count > 1)
,但这需要我从实体获取实体存储库。
很快就会有大量逻辑可以进行取消链接然后删除(或不删除)的操作,以防止出现孤立记录。逻辑并不像级联那样简单,因为地址和个人资料之间可能有很多人。也有房屋记录。
我应该只在地址存储库中构建查询,然后在控制器中设置标志吗? (树枝会读取标志并显示是否显示交织)
答案 0 :(得分:0)
实体存储库是用于保存您对与某个实体相关的数据库的所有查询的类,在您的情况下为address
。因此,是,您应该在AddressRepository
中创建新方法并在需要的地方使用。
不确定代码重用的含义,几乎可以在symfony类的任何地方获得存储库。因此,您编写类似
$count = $this->getDoctrine()
->getRepository(ContactAddress::class)
->getDependencyCount($address->getId());
并在代码中使用此$count
变量。正如我已经说过的那样,这很简单明了。
在symfony4中,您甚至可以将存储库注入控制器中,因此代码可以简化为:
public function __construct(AddressRepository $repo)
{
$this->repo = $repo;
}
public function someAction()
{
$count = $this->repo->getDependencyCount($address->getId());
}