我有以下查询:
$latestcontent = $em->createQuery('
SELECT c.title, c.content, c.lastedit, a.firstname, a.surname
FROM ShoutMainBundle:Content c, ShoutMainBundle:Admin a
WHERE c.author = a.id
ORDER BY c.lastedit ASC'
);
Run Code Online (Sandbox Code Playgroud)
我需要做的是限制从此查询返回的记录数量.但是,当我将LIMIT 10添加到SQL查询时,它会返回此错误:
错误:字符串的预期结束,得到'LIMIT'.
所以,我看了一下,发现你可以添加->limit(10)到代码中(在查询之后).但是这会引发这个PHP错误:
Fatal error: Call to undefined method Doctrine\ORM\Query::limit() in C:\wamp\www\src\Shout\AdminBundle\Controller\DefaultController.php on line 22
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我在"ext_translations"表中有一个包含所有翻译的表.
翻译工作很棒.现在的问题是:我想通过sonata-admin包管理这些翻译.
我已经找到了一个文档,如何使用sonata admin获取工作原理扩展.但在我的情况下,我有一个表/实体用于我的所有翻译(对于多个实体).
所以根据这个文档:http://www.elao.com/blog/symfony-2/doctrine-2/how-to-manage-translations-for-your-object-using-sonataadminbundle.html应该是我的mappedBy属性(见下文)?
ext_translations表:
mysql> show columns from ext_translations;
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| locale | varchar(8) | NO | MUL | NULL | |
| object_class | varchar(255) | NO | | NULL | |
| field | varchar(32) | NO | | NULL | |
| foreign_key | …Run Code Online (Sandbox Code Playgroud) 你对学说的体验是什么?我从来都不是一个ORM类型的人,我主要管理像adodb这样的基本数据库抽象层.
但我理解了它的所有概念和好处.所以当一个需要ORM的项目出现时,我认为我会尝试一个ORM框架.
我要在学说和推进之间做出决定,所以我选择了学说,因为我不想处理这个要求.
我不知道我做错了什么.我带着正确的心态进来了.我绝不是一个'初级'php小子.但是我每一步都在与系统作斗争.有很多文档,但都觉得有点混乱.而简单的东西,如YAML到数据库表创建只是不工作,只是没有错误或任何东西bork out.很多其他的东西工作有点时髦需要在工作之前进行额外的调整.
也许我在这里做了一些愚蠢的新手假设,一旦我发现它是什么我会有一个啊哈的时刻.但现在我完全讨厌这个系统.
是否有人可以给出一些提示或者可能指向我关于这个主题或某个权威网站/人的关于此的良好资源?或者只是推荐另一个"正常工作"的ORM框架?
我有以下使用IN语句的查询.
$ids = array(1,2,3);
$query = 'select o from Organisation o where o.id in (:ids)';
$this->_entityManager->createQuery($query)
->setParameter('ids', implode(', ', $ids))
Run Code Online (Sandbox Code Playgroud)
Doctrine没有返回任何结果,我认为这是因为Doctrine对传递的参数$ids(即数组)所做的转换有问题.
如何使它工作?
是否有一种简单的方法将依赖注入到Doctrine2中的每个存储库实例中?
我已经尝试过监听loadClassMetadata事件并在存储库上使用setter注入,但这自然导致无限循环,因为getRepository事件中的调用触发了同一事件.
在看了一下这个Doctrine\ORM\EntityManager::getRepository方法之后,看起来存储库根本就没有使用依赖注入,而是在函数级别实例化它们:
public function getRepository($entityName)
{
$entityName = ltrim($entityName, '\\');
if (isset($this->repositories[$entityName])) {
return $this->repositories[$entityName];
}
$metadata = $this->getClassMetadata($entityName);
$customRepositoryClassName = $metadata->customRepositoryClassName;
if ($customRepositoryClassName !== null) {
$repository = new $customRepositoryClassName($this, $metadata);
} else {
$repository = new EntityRepository($this, $metadata);
}
$this->repositories[$entityName] = $repository;
return $repository;
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗 ?
我有以下图库实体
class Gallery
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var ArrayCollection
* @ORM\OneToMany(targetEntity="Tessa\GalleryBundle\Entity\Photo", mappedBy="gallery", cascade={"persist", "remove"})
*/
private $photos;
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
这gallery与实体的manyToOne关系有关PointOfInterest.这是宣言
class PointOfInterest
{
/* ... */
/**
* @ORM\ManyToOne(targetEntity="Tessa\GalleryBundle\Entity\Gallery", cascade={"persist", "remove"})
* @ORM\JoinColumn(nullable=false)
*/
private $gallery;
/* ... */
Run Code Online (Sandbox Code Playgroud)
我还使用表单来更新PointOfInterest实体.这是表格声明
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', 'text')
->add('gallery', new GalleryType())
;
}
Run Code Online (Sandbox Code Playgroud)
和 …
我有一个ManyToMany我闯入OneToMany和ManyToOne关系.我想构建一个具有复选框而不是集合的表单,我正在使用'DoctrineObject'保湿器,但它不起作用,我不知道出了什么问题.
我从我的代码中删除了所有其他不相关的字段.
角色实体:
/**
* @orm\Entity
* @orm\Table(name="roles")
*/
class RolesEntity extends HemisEntity {
/**
* @orm\Id
* @orm\Column(type="integer");
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @orm\Column(name="role_code",type="string")
*/
protected $roleCode;
/**
* @orm\OneToMany(targetEntity="RolesPermissionsEntity", mappedBy="role", cascade={"persist"})
*/
protected $rolePermissions;
public function __construct()
{
$this->rolePermissions = new ArrayCollection();
}
public function setRolePermissions($rolePermissions)
{
$this->rolePermissions = $rolePermissions;
return $this;
}
public function addRolePermissions(Collection $rolePermissions)
{
foreach ($rolePermissions as $rolePermission) {
$rolePermission->setRole($this);
$this->rolePermissions->add($rolePermission);
}
}
public function …Run Code Online (Sandbox Code Playgroud) 我是Doctrine的新手,对我来说还有一些模糊的区域.在这种情况下,我使用循环和实体管理器在数据库中插入新记录.它工作正常,但我注意到Doctrine按实体进行一次插入查询,这可能会变得非常庞大.
使用Doctrine2和Symfony 2.3,我想知道如何设置它,这样它只会产生一个带有所有值的插入查询(当然我们只讨论1个实体).
我的意思是改变这个:
INSERT INTO dummy_table VALUES (x1, y1)
INSERT INTO dummy_table VALUES (x2, y2)
Run Code Online (Sandbox Code Playgroud)
成
INSERT INTO dummy_table VALUES (x1, y1), (x2, y2)
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
$em = $this->container->get('doctrine')->getManager();
foreach($items as $item){
$newItem = new Product($item['datas']);
$em->persist($newItem);
}
$em->flush();
Run Code Online (Sandbox Code Playgroud) 这与我的另一个问题有关:使用REST API保持实体.
对于Symfony2中的项目,我需要能够使用远程(第三方)RESTful API来持久化实体.我还希望能够使用该API中的数据检索实体.
换句话说,我的对象保存在第三方数据库中.它们不会保存在我自己的数据库中.每当我需要保存数据或查找数据时,我都会使用他们的REST API.
我被指向了几个库,包括一个由Doctrine本身制作的库.但是,它们都没有为我提供我正在寻找的东西.由Doctrine制作的那个是最好的选择,但是使用Active Record模式并没有提供所有甜蜜的Doctrine 2.不要误会我的意思,我一直在使用Active Record实现,但我现在已经爱上了Doctrine的Data Mapper模式.
理想情况下,我希望能够使用Doctrine的ORM,只需用使用API调用保存实体的逻辑替换特定于数据库的部分.(当然,使用相同的API检索它们).这样我可以使用大致相同的语法保存我的实体:
// current way to save $entity in database:
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
// desired way to save $entity using REST API:
// (just an example, it doesn't have to be exactly like this)
$em = $this->getDoctrine()->getManager('rest');
$em->persist($entity);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
请注意,我不是要尝试构建自己的API,而只是尝试与第三方API进行通信以保存我的实体.我对Doctrine很新,但到目前为止我还是喜欢它.我真的很喜欢从实体中分离持久性逻辑的想法,但到目前为止我无法找到如何使用API来保存它们.
Symfony的文档中有一篇文章,描述了如何与多个实体经理合作.我正在寻找类似于此的解决方案,但是使用实体管理器可以使用REST而不是数据库.
我一直试图自己调整Doctrine的ORM,但我最终只重写了一半代码,因为它(似乎)与数据库特定的逻辑紧密耦合.当然,我可能会做一些愚蠢的事情.
所以我的问题是,有没有办法用自定义的方式替换/覆盖Doctrine ORM的数据库特定部分?没有重写很多应该对所有持久化方法都很常见的事情?以前做过吗?或者它是不可能的,因为Doctrine旨在与数据库一起使用,并且不够灵活,不能用于其他用途?
CakePHP似乎可以通过让您定义自定义DataSource来实现此目的.这样你可以使用SQL数据库保存模型,但也可以使用API,会话等.我想大致相同,但使用Doctrine代替CakePHP.
实际的数据库查询似乎是由Doctrine\ORM\Persisters\BasicEntityPersister类执行的
.还有其他几个xxxPersister类,用于处理不同类型的继承.有可能用我们自己的类替换xxxPersister类,因此我们可以用REST …
问题:
序列化Doctrine enitities集合时,虽然项目为空,但集合仍然有2个项目.
背景:
我有一些实体相互B延伸延伸A和C延伸B.在实体中,Test我有一个包含该类型对象的数组B.$test将在序列化时具有预期值(具有两个项目的集合).
$test包含一个变量(数组)数组中的collection一个项是类型B和一个类型C.
$sTest虽然项目是空的,但会获得两个项目的集合.这是$sTest串行化后字符串的外观$test "{"collection":[[],[]]}"
测试脚本:
$test = new Test();
$b = new B();
$b->setToken('asdf');
$b->setName('asdf');
$c = new C();
$c->setToken('asdf');
$c->setName('asdf');
$c->setDescription('asdf');
$test->addCollection($b);
$test->addCollection($c);
//Serialize
$serializer = $this->container->get('serializer');
$sTest = $serializer->serialize($test, 'json');
//Deserialize
$deserializer = $this->container->get('serializer');
$dTest = $deserializer->deserialize($sTest, 'Acme\DemoBundle\Entity\Test', 'json');
$em = $this->getDoctrine()->getManager();
$em->merge($dTest);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
A:
<?php
namespace …Run Code Online (Sandbox Code Playgroud) doctrine-orm ×10
symfony ×7
php ×6
doctrine ×1
dql ×1
mysql ×1
orm ×1
persistence ×1
rest ×1
sonata-admin ×1
sql ×1
zend-form2 ×1