Symfony2主义FindOneOrCreate

标签 symfony doctrine-orm

有了 propel,我们就有了 findOneOrCreate()

示例。

$bookTag = BookTagQuery::create()
->filterByBook($book)
->findOneOrCreate();   

在 Controller 的任何地方我们都可以做类似的事情。

...................
       $filename='something';
       $document_exists = $em->getRepository('DemoBundle:Document')
                ->findOneBy(array('filename' => $filename));

        if (null === $document_exists) {
            $document = new Document();
            $document->setFilename($filename);
            $em->persist($document);
            $em->flush();
        }    

在 Doctrine 中是否有其他方法可以实现这一目标?

可以在实体存储库中调用实体管理器吗? 有什么建议吗?

最佳答案

最简单的方法是扩展基础存储库:

// src/Acme/YourBundle/Entity/YourRepository.php
namespace Acme\YourBundle\Entity;

use Doctrine\ORM\EntityRepository;

class YourRepository extends EntityRepository
{
    public function findOneOrCreate(array $criteria)
    {
        $entity = $this->findOneBy($criteria);

        if (null === $entity)
        {
           $entity = new $this->getClassName();
           $entity->setTheDataSomehow($criteria); 
           $this->_em->persist($entity);
           $this->_em->flush();
        }

        return $entity
    }
}

然后告诉您的实体使用此存储库或进一步扩展特定实体:

// src/Acme/StoreBundle/Entity/Product.php
namespace Acme\StoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="Acme\YourBundle\Entity\YourRepository")
 */
class Product
{
    //...
}

并在您的 Controller 中使用它:

$em = $this->getDoctrine()->getManager();
$product = $em->getRepository('AcmeStoreBundle:Product')
              ->findOrCreate(array('foo' => 'Bar'));

来源:http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes

请注意存储库内的刷新,因为它会以这种方式刷新 EntityManager 中所有未保存的更改。

关于Symfony2主义FindOneOrCreate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17935647/

相关文章:

database - 使用 Symfony2 和 Doctrine 2 从数据库加载大数据

php - Symfony2 + Doctrine,在关系中找到

symfony - 如何在 Symfony2 中实现 Multi-Tenancy 翻译

symfony - 当referencedColumnName与 "id"不同时,在Symfony2中使用解析目标实体的实体之间的关系

sql - 按用户名分组并选择列的总和

symfony - 列表中的速录媒体展示

doctrine-orm - Doctrine :如果不选择至少一个根实体别名,则无法通过标识变量选择实体

symfony - Doctrine 2.5 : Unrecognized field (but only in Symfony's prod mode)

php - 将 PostgreSQL DEFAULT 与 Doctrine 一起使用?

php - 如何将参数传递给 Symfony2 Twig block ?