Doctrine 实体自定义 getter

Posted

技术标签:

【中文标题】Doctrine 实体自定义 getter【英文标题】:Doctrine entity custom getter 【发布时间】:2016-03-09 09:53:03 【问题描述】:

我怎样才能使这个例子发生? Garage en red Cars 之间没有任何关系。 Garage en Cars 之间只有一个关系。 我知道我可以为此使用存储库,但实际上我想要车库中的吸气剂,它只会返回红色汽车。我假设 DQL 将成为 awnser 的一部分。

$myFavoriteCars = $myGarage->getRedCars();

Garage.php:
---------------------------
@OneToMany(...Car...)
private $cars

public function getCars()

    return $this->cars;


public function getRedCars()

    // How to receive only the red cars?
    // Some DQL in here?



Car.php:
-------------------------
@ManyToOne(...Garage...)
private $garage

private $color

谢谢。 理查德

【问题讨论】:

您的实体中不应有数据访问逻辑。它破坏了关注点分离,使测试更难,并且无助于可维护性。您的数据访问层和域层应该分开。这就是存储库的用途。 【参考方案1】:

据我所知,这是不可能的。

我建议通过将@ORM\Entity 行添加到 Garage.php 来为您的 Garage 实体创建一个特定的存储库:

/**
 * Garage
 *
 * @ORM\Table(name="garages")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\GarageRepository")
 */
class Garage

然后在您的包中创建一个名为 Repository 的新文件夹,并在该文件夹中创建 GarageRepository.php。该文件可能类似于下面的示例。

<?php    
namespace AppBundle\Repository;


use Doctrine\ORM\EntityRepository;

/**
 * Class GarageRepository
 *
 * @package AppBundle\Repository
 */
class GarageRepository extends EntityRepository

    /**
     * finds one or more cars with a specific color
     *
     * @param string|int $color Could be a string like 'red' or and enumeration like Color::red which translate to an
     *                          integer or the id from a color if the colors are in the database.
     *
     * @return mixed
     * @throws \Doctrine\ORM\NonUniqueResultException
     */
    public function findCarsByColor($color)
    
        return $this->createQueryBuilder('g')
                    ->where('g.color = :color')
                    ->setParameter('color', $color)
                    ->getQuery()
                    ->getOneOrNullResult();
    

或者更短的解决方案可能是在您的控制器中添加$this-&gt;getDoctrine()-&gt;getRepository('AppBundle:Garage')-&gt;findBy(['color' =&gt; 'red']);。这样您就不必创建单独的存储库类,因为学说将使用默认的。但在所有情况下,您都需要通过理论访问数据。

【讨论】:

我尽量避免使用存储库。 AFAIK 您的存储库将返回红色车库。我认为 CarRepository::getByGarageAndColor(Garage, color) 可以解决问题。不幸的是,这不是我正在寻找的解决方案。 'indexBy' 解决方案是我要研究的。感谢您的思考。 更新了我的答案,部分索引有误。无论如何,您为什么要避免使用存储库?因为 Doctrine 是使用存储库模式构建的。

以上是关于Doctrine 实体自定义 getter的主要内容,如果未能解决你的问题,请参考以下文章

ZF2 Doctrine - 使用查询构建器如何指向存储库中的自定义方法

Symfony2 doctrine来自特定实体的更新架构

教义自定义存储库方法和非托管实体

Doctrine 2 自定义 ObjectMultiCheckbox 值

为啥这个 Doctrine OneToOne 自引用双向关联不起作用?

如何生成扩展自定义记录类的 Doctrine 模型/类