我很难理解Doctrine手册中有关级联操作的解释 ,需要有人帮助我理解简单的ManyToOne关系的选项。 在我的应用程序中,我有一个名为Article的表/实体,它有一个外键字段,引用名为Topic的表/实体中的“id”字段。 当我创build一个新的文章,我从下拉菜单中select主题。 这会在文章表中的“topic_id”外键字段中插入一个整数。 我在Article实体中设置了$ topic关联,如下所示: /** * @ManyToOne(targetEntity="Topic") * @JoinColumn(name="topic_id", referencedColumnName="id", nullable=false) */ private $topic; Topic主题实体没有任何关于Article实体的相互注释。 主题不关心什么文章引用它们,当引用该主题的文章被删除时什么都不需要发生在主题上。 因为我没有在Article实体中指定级联操作,所以当我尝试创build一个新的Article时,Doctrine会抛出一个错误:“通过未configuration为级联持久化操作的关系find新的实体。显式地坚持新的实体或者在关系上configuration级联持久化操作。“ 所以我知道我需要select一个级联操作来包含在Article实体中,但是我怎么知道在这种情况下select哪个操作呢? 从阅读教义手册,“分离”听起来像是正确的select。 但是在这里和这里研究别人的类似问题让我觉得我想用“坚持”来代替。 任何人都可以帮助我理解什么“坚持”,“删除”,“合并”和“分离”意味着就像我所描述的一个简单的ManyToOne关系?
在Doctrine文档中,他们提到@GeneratedValue注释存在一些不同的策略: AUTO SEQUENCE TABLE IDENTITY UUID CUSTOM NONE 请有人解释所有的战略之间的差异?
这是我正在尝试显示用户历史logging的function。 为此,我需要显示用户的当前信用以及他的信用logging。 这是我想要做的: public function getHistory($users) { $qb = $this->entityManager->createQueryBuilder(); $qb->select(array('a','u')) ->from('Credit\Entity\UserCreditHistory', 'a') ->leftJoin('User\Entity\User', 'u', \Doctrine\ORM\Query\Expr\Join::WITH, 'a.user = u.id') ->where("a.user = $users ") ->orderBy('a.created_at', 'DESC'); $query = $qb->getQuery(); $results = $query->getResult(); return $results; } 但是,我得到这个错误: [语法错误]行0,列98:错误:预期的学说\ ORM \查询\ Lexer :: T_WITH,得到'开' 编辑 :我用连接条款中的“WITH”replace了“ON”,现在我所看到的只是来自连接列的1个值。
是否有可能以类似于以下方式更新实体: $data = new ATest(); // my entity $data->id = 1; // id 1 already exists, I just want to update this row $data->name = "ORM Tested"; // changed the name $entityManager->persist($data); $entityManager->flush(); 这将插入和更改对象的id,而不是更新数据库中的现有行。
我有一个父域的树结构。 目前我正试图让所有的父节点显示当前节点的path。 基本上我正在做一个while循环来处理所有节点。 $current = $node->getParent(); while($current) { // do something $current = $current->getParent(); } 使用默认的findById方法工作。 由于该实体具有一些聚合字段,因此我使用自定义存储库方法来加载具有一个查询的所有基本字段。 public function findNodeByIdWithMeta($id) { return $this->getEntityManager() ->createQuery(' SELECT p, a, c, cc, ca, pp FROM TestingNestedObjectBundle:NestedObject p JOIN p.actions a LEFT JOIN p.children c LEFT JOIN c.children cc LEFT JOIN c.actions ca LEFT JOIN p.parent pp WHERE p.id […]
在Doctrine findBy()方法中是否可以使用OR语句? 我知道给定的数组被解释为case1 AND case2…像这样 $this->repos['notif']->findBy(array('status' => 1, 'status' => 2, 'status' => 3); 代表 SELECT * FROM `notif` WHERE status=1 AND status=2 AND status=3; 现在我需要一些东西来代表: SELECT * FROM `notif` WHERE status=1 OR status=2 OR status=3; 有办法得到所有案件吗?
要在Symfony中使用基于URL的不同实体pipe理器/连接(如果相当容易)。 使用以下路由configuration connection: pattern: /a/{connection} defaults: { _controller: AcmeTestBundle:User:index } 并从以下食谱; 如何使用多个实体pipe理器和连接 我的控制器看起来像这样; class UserController extends Controller { public function indexAction($connection) { $products = $this->get('doctrine') ->getRepository('AcmeStoreBundle:Product', $connection) ->findAll() ; ……………… 我将能够从不同的em /连接/数据库获取产品信息。 现在,如果我添加这样的东西到我的路由; login: pattern: /a/{connection}/login defaults: { _controller: FOSUserBundle:Security:login } 我怎样才能轻松使login使用连接定义在连接variables? 这个设置假定每个数据库都有自己的用户login信息(fos_user表)。 编辑:更新路由信息 EDIT2: 尽pipe如此,我还是使用PHP / Symfony / Doctrine,所以请原谅我,如果我完全错了。 我试图在FOS \ UserBundle \ Doctrine […]
我试图写一个查询(与子查询),但我不知道如何在我的子查询设置限制。 我的查询: $query_ids = $this->getEntityManager() ->createQuery( "SELECT e_.id FROM MuzichCoreBundle:Element e_ WHERE […] GROUP BY e_.id") ->setMaxResults(5) ; $query_select = "SELECT e FROM MuzichCoreBundle:Element e WHERE e.id IN (".$query_ids->getDql().") ORDER BY e.created DESC, e.name DESC" ; $query = $this->getEntityManager() ->createQuery($query_select) ->setParameters($params) ; 但是– > setMaxResults(5)不起作用。 SQL查询中没有“LIMIT”。 我们可以做简单的LIMIT与教条2?
我需要插入一个有关联的实体。 如果我已经有关联实体的FK,有没有办法将主要实体插入数据库只有FK的填充? 或者我总是不得不这样做 通过FK检索相关的实体, 根据关联填充主实体的属性, 然后调用persist方法。
我正在开发一个使用Symfony2和学说2的应用程序。我想知道如何获取当前login用户的ID。