Doctrine Entity Repository如何在所有'find *'函数中添加'andWhere'?

时间:2016-02-11 15:14:43

标签: symfony doctrine-orm

由于遗留原因,我有一个用于多种用途的表。只有行的子集与我正在编写的实体相关。标准很简单,只需检查'project'字段以获取特定值。

而不是重新实现find,findAll,findByName,findByID,findBy ....只需通知doctrine将单个条件附加到它们全部。如果没有重新实现每一个发现,这是否可能?*

或者也许它可以在情人级别上完成?

更新

  • 重写问题,指明哪种解决方案是可以接受的。

2 个答案:

答案 0 :(得分:2)

易于使用的解决方案是使用您的自定义Repository功能创建find

然后,如果您的所有实体都有特定的Repository,请从您的实体(包含自定义Repository方法)延伸(find),否则(您没有)每个实体Repository),使用repositoryClass注释的@ORM\Entity选项将存储库分配给您的所有实体,如:

@ORM\Entity(repositoryClass="YourMainRepository")

否则,如果您不想在实体中放置任何存储库,请覆盖整个默认存储库并自定义find方法。

由于特殊需要,我已经使用了最后一个选项,我也邀请您查看以下问题:

Abstract repository and @Entity annotation inheritance

查看包含所有必需步骤的要点的解决方案,以覆盖默认的doctrine存储库。

请参阅Custom Repository classes

答案 1 :(得分:1)

<强>实体

<?php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Phrase
*
* @ORM\Table(name="User")
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
*/
class User
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="bigint")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
.............................................................
.............................................................
.............................................................

您的存储库

namespace AppBundle\Repository;

use Doctrine\ORM\EntityRepository;

class UserRepository extends EntityRepository
{
    /** For example **/
    public function getByName($name)
    {
        $qb = $this->createQueryBuilder('u')
         ->where('u.name = :name')->setParameter('name', $name)
         ->andWhere('u.lastname LIKE :name')->setParameter('lastname', '%'.$name.'%');

        $query = $qb->getQuery();

        return $query->getResult();
    }
}

在您的控制器中:

 /**
 * @Route("/", name="index")
 */
public function indexAction(Request $request)
{
    $userRepository = $this->getDoctrine()->getRepository('AppBundle:User');
    $userName = $userRepository->getByName($name);

............................................... ................................... .................................................. ................................