在各种情况下,我需要Doctrine\Common\Collections\ArrayCollection
根据对象中的属性对其进行排序.如果没有找到立即执行的方法,我会这样做:
// $collection instanceof Doctrine\Common\Collections\ArrayCollection
$array = $collection->getValues();
usort($array, function($a, $b){
return ($a->getProperty() < $b->getProperty()) ? -1 : 1 ;
});
$collection->clear();
foreach ($array as $item) {
$collection->add($item);
}
Run Code Online (Sandbox Code Playgroud)
我认为这不是最好的方法,你必须将所有内容复制到本机PHP数组并返回.我想知道是否有更好的方式来"使用"a Doctrine\Common\Collections\ArrayCollection
.我想念任何文件吗?
在Doctrine2中使用以下内容:
$user = array('username' => 'example', 'passsword' => 'changeme');
$conn->insert('users', $user);
Run Code Online (Sandbox Code Playgroud)
那么我如何获得刚刚插入的用户的最后一个ID?如果无法做到这一点,那么如何生成id以便您可以执行以下操作:
$id = //something here.
$user = array('username' => 'example', 'passsword' => 'changeme', 'id' => $id);
$conn->insert('users', $user);
Run Code Online (Sandbox Code Playgroud) 有没有办法在使用时自动引用Doctrine 2的保留字$entityManager->find('entity', id)
?
使用查询构建器时可以这样做但是应该有一个全局配置设置来执行此操作吗?我不想在保留字的注释中指定它.
实际上我对symfony2和doctrine2的组合有很多麻烦.我必须处理大量数据集(大约2-3百万次写入和读取),并且必须做很多额外的工作以避免内存不足.
我找出了2个要点,即"泄漏"内存(它们实际上并没有泄漏,而是分配了很多)
Entitymanager实体存储(我不知道这个的真实名称)似乎它保留了所有处理过的entites,你必须定期清除这个存储
$entityManager->clear()
Doctrine QueryCache - 它缓存所有使用的查询,我发现的唯一配置是你能够决定你想要使用什么类型的Cache.我没有发现全局禁用每个查询禁用它的有用标志.因此通常使用该函数为每个查询对象禁用它
$qb = $repository->createQueryBuilder($a); $query = $qb->getQuery(); $query->useQueryCache(false); $query->execute();
所以..这就是我现在想出来的..我的问题是:
是否有一种简单的方法可以从Entitymanagerstorage中拒绝某些对象?有没有办法在entitymanager中设置querycache?我可以在symonfony doctrine配置中配置这种缓存行为吗?
如果有人对我有一些不错的提示,那将是非常酷的..否则这可能会帮助一些菜鸟......
CYA
我设置了一个监听器类,我将在任何doctrine prePersist上设置ownerid列.我的services.yml文件看起来像这样......
services:
my.listener:
class: App\SharedBundle\Listener\EntityListener
arguments: ["@security.context"]
tags:
- { name: doctrine.event_listener, event: prePersist }
Run Code Online (Sandbox Code Playgroud)
我的班级看起来像这样......
use Doctrine\ORM\Event\LifecycleEventArgs;
use Symfony\Component\Security\Core\SecurityContextInterface;
class EntityListener
{
protected $securityContext;
public function __construct(SecurityContextInterface $securityContext)
{
$this->securityContext = $securityContext;
}
/**
*
* @param LifecycleEventArgs $args
*/
public function prePersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
$entityManager = $args->getEntityManager();
$entity->setCreatedby();
}
}
Run Code Online (Sandbox Code Playgroud)
结果是以下错误.
ServiceCircularReferenceException:检测到服务"doctrine.orm.default_entity_manager"的循环引用,路径:"doctrine.orm.default_entity_manager - > doctrine.dbal.default_connection - > my.listener - > security.context - > security.authentication.manager - > fos_user .user_manager".
我的假设是安全上下文已经被注入链中的某个地方,但我不知道如何访问它.有任何想法吗?
您知道如何从我的控制器类中的实体声明中获取表名
实体类
<?php
namespace Acme\StoreBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Acme\StoreBundle\Entity\User
*
* @ORM\Table(name="users")
* @ORM\Entity
*/
class User
Run Code Online (Sandbox Code Playgroud)
我现在想获取User实体的表名,我将如何在Symfony2控制器中执行此操作?
是否可以OR
在Doctrine findBy()
方法中使用语句?我知道给定的数组被解释为case1 AND case2...
像这样
$this->repos['notif']->findBy(array('status' => 1, 'status' => 2, 'status' => 3);
Run Code Online (Sandbox Code Playgroud)
代表
SELECT * FROM `notif` WHERE status=1 AND status=2 AND status=3;
Run Code Online (Sandbox Code Playgroud)
现在我需要一些东西代表:
SELECT * FROM `notif` WHERE status=1 OR status=2 OR status=3;
Run Code Online (Sandbox Code Playgroud)
有办法获得所有案件吗?
在Doctrine文档中,他们提到@GeneratedValue
注释存在一些不同的策略:
AUTO
SEQUENCE
TABLE
IDENTITY
UUID
CUSTOM
NONE
有人请解释所有人的策略之间的差异吗?
我已经创建了一个实体A
与OneToMany
关系B
,这有关系OneToMany
到C
.
我必须克隆此A
实体并使用新的id在数据库中设置它.所有深层关系也应该用新的ID来克隆.
我试过的是将A
id 设置为null
:
$A = clone $A_original;
$A->setId(null);
$em->persist($A);
Run Code Online (Sandbox Code Playgroud)
它在A
表中创建新记录,但不在B
和中C
.
我该怎么做才能制作完整的A
实体副本?
doctrine-orm ×10
php ×3
symfony ×3
doctrine ×1
findby ×1
memory-leaks ×1
orm ×1
symfony-2.1 ×1