小编hac*_*k25的帖子

使用DQL延迟加载Doctrine2和Symfony2

我有一个父结构的树结构.目前我正在尝试让所有父节点显示当前节点的路径.

基本上我正在做一个while循环来处理所有节点.

$current = $node->getParent();
while($current) {
  // do something
  $current = $current->getParent();
}
Run Code Online (Sandbox Code Playgroud)

使用默认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 = :id
        ')
        ->setParameter('id', $id)
        ->setHint(
            \Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
            'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
        )
        ->getOneOrNullResult();
}
Run Code Online (Sandbox Code Playgroud)

使用该代码,加载父项失败.我只得到直接的父母(由LEFT JOIN p.parent pp他们解决)而不是上面的父母.例如$node->getParent()->getParent() …

php symfony doctrine-orm

37
推荐指数
1
解决办法
2188
查看次数

将数组映射到Symfony2/Doctrine2中的实体

我正在使用DoctrineFixtures包在开发期间创建示例实体.在我的ORM fixtures load()方法中,我将数据定义为关联数组并在循环中创建实体对象.

<?php
// ...
public function load($manager) {
    $roleDefs = array(
        'role-1' => array(
             'role' => 'administrator'
        ),
        'role-2' => array(
             'role' => 'user'
        ),
    );

    foreach($roleDefs as $key => $roleDef) {
        $role = new Role();
        $role->setRole($roleDef['role']);
        $manager->persist($role);

        $this->addReference($key, $role);
    }

    $manager->flush();
}
Run Code Online (Sandbox Code Playgroud)

我总是使用相同的数组模式.每个数组元素都使用实体的属性名称(以下划线表示法)作为索引.如果实体结构变得更复杂,则会有很多$entity->setMyProperty($def['my_property']);行.

我认为将属性名映射到setter方法的问题是Symfony和Doctrine中非常常见的问题,因为在许多情况下都会发现这种类型的映射(例如,将表单映射到实体).

现在我想知道是否有可用于映射的内置方法.有一个像这样的解决方案会很好

foreach($defs as $key => $def) {
   $entity = $magicMapper->getEntity('MyBundle:MyEntity', $def);
   // ...
}
Run Code Online (Sandbox Code Playgroud)

有人知道如何实现这一目标吗?

非常感谢Hacksteak

symfony doctrine-orm

7
推荐指数
1
解决办法
1万
查看次数

PHP如何检测会话已超时?

我想知道PHP如何检测特定会话已超时.

详细说明:我正在使用默认的(基于文件的)会话处理程序,具有默认的会话生存期等等.php.ini中的所有内容都是默认的.

如果现在启动了一个会话,那么如果有任何超时会话,PHP会进行检查(取决于非session.gc_divisor和session.gc_probability).但是从哪里获取PHP会话的最后一个会话访问时间来检查?

会话文件本身仅包含工作负载,例如x|i:1;a $_SESSION['x'] = 1;,因此没有关于上次会话访问时间的信息.

我认为没有与会话开始时间相关的内存信息,因为在完整服务器重启后会话仍在工作.

那么,PHP从哪里获取信息?它是否比较会话文件的mtime/ctime?

php session

7
推荐指数
1
解决办法
659
查看次数

标签 统计

doctrine-orm ×2

php ×2

symfony ×2

session ×1