-5

在 Symfony 中,我使用默认的 ORM 原则,但是这个工具不能给我足够的方法来处理不同的情况。我想编写自己的类并使用 DBAL 之类的东西,仅用于进行自定义 SQL 查询并获取结果的连接。谁能给我一些例子?我应该使用哪些类来制作模型层,扩展我的功能。

4

2 回答 2

0

作为一个好的做法,您可以将所有自定义查询(SQL 或 DQL)放在EntityRepository

这是自定义 EntityRepository 的示例

use Doctrine\ORM\EntityRepository;
use \Doctrine\Common\Collections\Criteria;

/**
 * RequestRepository
 *
 */
class RequestRepository extends EntityRepository
{

    public function findByStatus($status = array(), $limit = 5, $orderBy = null)
    {
        $queryBuilder = $this->_em->createQueryBuilder();
        $queryBuilder
        ->select('n')
        ->from('BaseBundle:Request', 'n')
        ->where('n.status IN (:status)')
        ->setParameter('status', $status)
        ->setMaxResults($limit);
        if (!is_null($orderBy)) {
            $queryBuilder->orderBy('n.' . $orderBy[0], $orderBy[1]);
        }

        $lines = array();
        foreach ($queryBuilder->getQuery()->getResult() as $line) {
            $lines[] = $line;
        }
        return $lines;
    }

    public function getByExpressions($expressions = array(), $limit = 5, $orderBy = null)
    {
        $criteria = Criteria::create();
        if (!empty($expressions)) {
            foreach ($expressions as $expression) {
                $criteria->andWhere($expression);
            }
        }
        $criteria->setMaxResults($limit);
        if (!is_null($orderBy)) {
            $criteria->orderBy($orderBy);
        }
        return $this->matching($criteria);
    }
}

在实体代码中,您定义此自定义存储库,如下所示:

use Doctrine\ORM\Mapping as ORM;

/**
 * Request
 *
 * @ORM\Table(name="request")
 * @ORM\Entity(repositoryClass="BaseBundle\Repository\RequestRepository")
 */
class Request
{
//Entity code, irrelevant here
}
于 2014-09-09T09:13:00.543 回答
0

如果您想使用学说编写自己的 SQL 查询,可以查看该文档页面: http ://doctrine-orm.readthedocs.org/en/latest/reference/native-sql.html

但大多数时候 DQL 绰绰有余

这是我做的一个项目,忽略我的 sql 查询

//Daily Alerts
$dailyAlertsQuery = $em
        ->createQuery("
            SELECT COUNT (a) AS daily
            FROM XXX\xxxBundle\Entity\Alert a
            JOIN a.user u
            WHERE a.mentionUpdate = '1'
            AND u.isActive = '1'
            ")
        ->getResult();

$dailyAlerts = new ArrayCollection($dailyAlertsQuery);
于 2014-09-09T08:28:10.913 回答