我有一个父结构的树结构.目前我正在尝试让所有父节点显示当前节点的路径.
基本上我正在做一个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() …
我正在使用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
我想知道PHP如何检测特定会话已超时.
详细说明:我正在使用默认的(基于文件的)会话处理程序,具有默认的会话生存期等等.php.ini中的所有内容都是默认的.
如果现在启动了一个会话,那么如果有任何超时会话,PHP会进行检查(取决于非session.gc_divisor和session.gc_probability).但是从哪里获取PHP会话的最后一个会话访问时间来检查?
会话文件本身仅包含工作负载,例如x|i:1;a $_SESSION['x'] = 1;,因此没有关于上次会话访问时间的信息.
我认为没有与会话开始时间相关的内存信息,因为在完整服务器重启后会话仍在工作.
那么,PHP从哪里获取信息?它是否比较会话文件的mtime/ctime?