Symfony 2.5和自己的模型

时间:2014-09-09 08:15:55

标签: php symfony doctrine-orm dbal

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

2 个答案:

答案 0 :(得分:0)

如果您想用doctrine编写自己的SQL查询,可以查看该doc页面: 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);

答案 1 :(得分: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
}