[Doctrine\ORM\ORMException]
The EntityManager is closed.
Run Code Online (Sandbox Code Playgroud)
在插入数据后出现DBAL异常后,EntityManager关闭,我无法重新连接它.
我试过这样但是没有得到联系.
$this->em->close();
$this->set('doctrine.orm.entity_manager', null);
$this->set('doctrine.orm.default_entity_manager', null);
$this->get('doctrine')->resetEntityManager();
$this->em = $this->get('doctrine')->getEntityManager();
Run Code Online (Sandbox Code Playgroud)
任何人都知道如何重新连接?
我需要使用比较标准的"魔术查找器"findBy方法(不仅仅是准确的标准).换句话说,我需要做这样的事情:
$result = $purchases_repository->findBy(array("prize" => ">200"));
Run Code Online (Sandbox Code Playgroud)
这样我就可以获得奖金超过200的所有购买.
我有这个symfony代码,它检索与项目上的博客部分相关的所有类别:
$category = $catrep->createQueryBuilder('cc')
->Where('cc.contenttype = :type')
->setParameter('type', 'blogarticle')
->getQuery();
$categories = $category->getResult();
Run Code Online (Sandbox Code Playgroud)
这有效,但查询包含重复项:
Test Content
Business
Test Content
Run Code Online (Sandbox Code Playgroud)
我想DISTINCT在我的查询中使用该命令.我见过的唯一例子要求我编写原始SQL.我想尽可能地避免这种情况,因为我试图保持所有代码相同,因此它们都使用Symfony2/Doctrine提供的QueryBuilder功能.
我尝试distinct()像这样添加到我的查询中:
$category = $catrep->createQueryBuilder('cc')
->Where('cc.contenttype = :type')
->setParameter('type', 'blogarticle')
->distinct('cc.categoryid')
->getQuery();
$categories = $category->getResult();
Run Code Online (Sandbox Code Playgroud)
但它会导致以下错误:
致命错误:调用未定义的方法Doctrine\ORM\QueryBuilder :: distinct()
如何告诉symfony选择distinct?
假设我有实体$e.有没有通用的方法将它存储为另一行,它将具有相同的实体数据但是另一个主键?
为什么我需要这个:我正在实现某种时态数据库模式,而不是更新行我只需要创建另一个.
在Doctrine中,您可以通过两种方式创建DQL:
EntityManager :: createQuery:
$query = $em->createQuery('SELECT u FROM MyProject\Model\User u WHERE u.id = ?1');
Run Code Online (Sandbox Code Playgroud)
QueryBuilder:
$qb->add('select', 'u')
->add('from', 'User u')
->add('where', 'u.id = ?1')
->add('orderBy', 'u.name ASC');
Run Code Online (Sandbox Code Playgroud)
我想知道区别是什么,我应该使用哪个?
什么之间的区别Doctrine\Common\Persistence\ObjectManager,并Doctrine\ORM\EntityManager在自定义表单类型使用的时候吗?
我可以使用$this->em->getRepository()和来获取存储库$this->om->getRepository().
class MyFormType extends \Symfony\Component\Form\AbstractType
{
/**
* @var Doctrine\ORM\EntityManager
*/
protected $em;
public function __construct(Doctrine\ORM\EntityManager $em)
{
$this->em = $em;
}
}
Run Code Online (Sandbox Code Playgroud)
代替:
class MyFormType extends \Symfony\Component\Form\AbstractType
{
/**
* @var Doctrine\Common\Persistence\ObjectManager
*/
protected $om;
public function __construct(Doctrine\Common\Persistence\ObjectManager $om)
{
$this->om = $om;
}
}
Run Code Online (Sandbox Code Playgroud) 我已经更新了我的类定义以使用新引入的属性类型提示,如下所示:
class Foo {
private int $id;
private ?string $val;
private DateTimeInterface $createdAt;
private ?DateTimeInterface $updatedAt;
public function __construct(int $id) {
$this->id = $id;
}
public function getId(): int { return $this->id; }
public function getVal(): ?string { return $this->val; }
public function getCreatedAt(): ?DateTimeInterface { return $this->createdAt; }
public function getUpdatedAt(): ?DateTimeInterface { return $this->updatedAt; }
public function setVal(?string $val) { $this->val = $val; }
public function setCreatedAt(DateTimeInterface $date) { $this->createdAt = $date; }
public function setUpdatedAt(DateTimeInterface $date) { …Run Code Online (Sandbox Code Playgroud) 是否可以设置两个对象之间的关联,例如article,comment如下所示:
comment.setArticle(10) // 10 is the id of article
Run Code Online (Sandbox Code Playgroud)
自动生成的setArtcicle方法当作参数对象文章,但也许有一些技巧可以做到这一点?
从性能的角度来看,这对我来说非常重要 - 我希望在我想设置关联时总是避免进行SQL调用.在我的情况下会有很多这样的不必要的查询.