【问题标题】:Symfony 2.5 and own modelsSymfony 2.5 和自己的模型
【发布时间】:2014-09-09 08:15:55
【问题描述】:

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

【问题讨论】:

  • 你也可以在 Doctrine 中使用原生查询。或者,如果您想要不同的 ORM,请查看 Propel,它也适用于 Symfony2。
  • 我应该扩展或实现哪些类来编写我自己的模型类?
  • 为什么没有阅读 Symfony2 和 Doctrine2 的官方文档?
  • 我读过,但有时解释不清楚。

标签: php symfony doctrine-orm dbal


【解决方案1】:

如果您想编写自己的 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);

【讨论】:

  • 所以我可以编写自己的模型类并在我的控制器中使用它,而无需直接在控制器中使用 SQL 代码。因为默认情况下 Symfony 不存在类似定义的模型。
【解决方案2】:

作为一种好的做法,您可以将所有自定义查询(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-10-28
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多