我是Doctrine,mongo和ODM设置的新手,在ZF1中使用这个设置时,我试图用约束复制一个简单的一个到多个引用.这是情况,并希望就如何实现这一点提出一些建议.
这是一个简单的用户 - >角色映射,所以在sql情况下我会有如下表:
Users - id - name - role_id Roles - id - name
然后,将在用户role_id上设置外键约束以映射到角色ID.删除角色后,将触发外键约束,停止操作.
我怎样才能在Doctrines MongoDB ODM中实现相同的目标?
到目前为止,我在User实体上使用了不同类型的注释,包括带有不同级联选项的@ReferenceOne @ReferenceMany ...
现在留给我的选择是在'role'实体上实现@PreUpdate,@ PreRemove生命周期事件,然后检查没有用户正在使用该角色,如果它们在更新时更改引用以匹配或删除抛出异常.
我在这里还是迷路了?
谢谢,
硅
如何缓存Doctrine MongoDB结果呢?查看Configuration的代码,它似乎没有像标准Doctrine那样的内置结果缓存,只有查询缓存.
我曾想过在应用程序中创建自己的缓存层,但返回的对象非常繁重,因为它们包含视图不需要的许多Doctrine逻辑.如何配对对象,使它们实际上只是数据容器?
我想收到大小大于零的数组"赞"的所有文件.我看到了一个使用 - > size()方法获取特定大小的数组的示例:
$qb = $dm->createQueryBuilder('Article')->field('comments')->size(0);
Run Code Online (Sandbox Code Playgroud)
但是要获得大小不等于零的数组,是否有选项可以做到这一点?
谢谢!
如何通过带有id的数组使用doctrine2命令?
我有这个问题:
$qb = $this->createQueryBuilder('u')
->select('u', 'n', 'c')
->leftJoin('u.notifications', 'n')
->leftJoin('u.channel', 'c')
->andWhere('u.id IN (:ids)')
->setParameter('ids', $ids);
Run Code Online (Sandbox Code Playgroud)
我希望结果与带有id的数组具有相同的顺序,是否可以这样做?
谢谢
解:
使用FIELD mysql扩展与https://github.com/beberlei/DoctrineExtensions
:)
谢谢
我可以在这个问题上使用一些帮助.我正在使用Symfony2 + mongodb + doctrine创建一个应用程序.我只想使用Doctrine ODM查询过去5分钟内登录过的所有用户.我有一个User集合,其中包含一个名为date_last_login的日期字段.
所以我尝试使用这样的querybuilder:
<?php
// Creating a DateTime object and susbtract 5 min from now
// local time is 15:40:05, timezone: 'Europe/Paris'
$_dateTime = new \DateTime();
$_interval5Min = new \DateInterval('PT5M');
$_dateTime->sub($_interval5Min);
$query = $this->createQueryBuilder('User')
->field('date_last_login')->gte($_dateTime)
->getQuery();
->execute();
Run Code Online (Sandbox Code Playgroud)
当我使用symfony2 profiler查看汇编的查询时,我得到的是:
db.User.find({ "date_last_login": { "$gte": new Date("Fri, 23 Dec 2011 15:30:05 +0100") } });
Run Code Online (Sandbox Code Playgroud)
看起来很好,除了日期提前10分钟而不是5分钟?我只是不明白.如果我转储我的php DateTime对象,日期是正确的:2011-12-23 15:35:05(15:40之前的五分钟).
所以我尝试组装相同的查询而不减少任何分钟,这一次,一切都很好:
<?php
// local time is 15:50:00
$query = $this->createQueryBuilder('User')
->field('date_last_login')->gte(new \DateTime())
->getQuery();
->execute();
// query is ok:
db.User.find({ "date_last_login": { …Run Code Online (Sandbox Code Playgroud) 我一直在尝试Symfony 2.2,FOSRest Bundle(使用JMS Serializer)和使用MongoDB的Doctrine ODM.
经过几个小时试图找出如何正确设置FOSRest捆绑包后,我仍然遇到一些麻烦:我有一个非常简单的路线,返回产品和价格列表.每当我请求HTML格式时,我得到正确的响应,但如果我请求任何其他格式(JSON,XML),我会收到错误:
[{"message": "Resources are not supported in serialized data. Path: Monolog\\Handler\\StreamHandler -> Symfony\\Bridge\\Monolog\\Logger -> Doctrine\\Bundle\\MongoDBBundle\\Logger\\Logger -> Doctrine\\Bundle\\MongoDBBundle\\Logger\\AggregateLogger -> Doctrine\\ODM\\MongoDB\\Configuration -> Doctrine\\MongoDB\\Connection -> Doctrine\\ODM\\MongoDB\\LoggableCursor",
"class": "JMS\\Serializer\\Exception\\RuntimeException",...
Run Code Online (Sandbox Code Playgroud)
你可以在这里看到完整的错误信息
我当前的设置非常简单:我创建了一个到控制器的单一路径,返回产品列表和价格(我按照这个例子来创建产品文档).
这是路线:
rest_product:
type: rest
resource: Onema\RestApiBundle\Controller\ProductController
Run Code Online (Sandbox Code Playgroud)
这是控制器:
<?php
namespace Onema\RestApiBundle\Controller;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use FOS\RestBundle\Controller\FOSRestController;
use FOS\RestBundle\Routing\ClassResourceInterface;
use FOS\Rest\Util\Codes;
use JMS\Serializer\SerializationContext;
use Onema\RestApiBundle\Document\Product;
class ProductController extends FOSRestController implements ClassResourceInterface
{
public function getAction()
{
$dm = $this->get('doctrine_mongodb')->getManager();
$products = $dm->getRepository('RestApiBundle:Product')->findAll();
if(!$products)
{
throw …Run Code Online (Sandbox Code Playgroud) 我有一个具有权限的事件,此权限引用用户.我正在尝试获取与用户相关的所有事件,但我似乎无法按照我的意愿获得教义.
这是我的Mongo架构
Array
(
[_id] => 4e63903cbc3470a2cd000002
[date] => 2011-10-09
[name] => Event1
[privileges] => Array
(
[0] => Array
(
[user] => Array
(
[$ref] => users
[$id] => 4e63611cbc347053a2000001
[$db] => eventdb
)
[role] => admin
)
)
[url] => Event1
)
Run Code Online (Sandbox Code Playgroud)
学说事件实体:
class Event {
/**
* @Id
*/
protected $id;
/**
* @String
*/
protected $name;
/**
* @EmbedMany(targetDocument="\Event\Privilege")
*/
protected $privileges = array();
}
Run Code Online (Sandbox Code Playgroud)
特权实体:
class Privilege {
/**
* @ReferenceOne(targetDocument="\User", cascade={"persist"})
*/
protected $user; …Run Code Online (Sandbox Code Playgroud) 如何在Symfony 2应用程序中正确设置服务容器以支持自定义文档存储库?
到目前为止我所拥有的是:
services:
acme.repository_user:
class: Acme\Repository\UserRepository
arguments: [@doctrine.odm.mongodb.document_manager]
Run Code Online (Sandbox Code Playgroud)
但是,当我查看DocumentRepository我UserRepository继承的类的构造函数时,我可以看到以下参数:
public function __construct(DocumentManager $dm, UnitOfWork $uow, Mapping\ClassMetadata $class)
Run Code Online (Sandbox Code Playgroud)
我似乎注入了文档管理器但是如何注入工作单元和类元数据?
我开始使用 Voter System 来保护我的 URL,但我有很多问题。
首先,我不知道我是否必须使用“角色”或“权限”。
“角色”是指 Role_User、Role_Manager 等。“权限”是指“Access_users”、“Edit_User”、“Add_User”等。
我说得对吗?
如果是,如果我没有要控制的对象,我想检查我的选民中的权限以控制对 URL 的访问。
例子
/**
* @Route("/", name="list")
* @Security("is_granted('ROLE_ADMIN') or is_granted('PERM_ACCESS_SERIES')")
*/
public function list()
{
$series = $this->seriesService->findAll();
return $this->render('backend/series/list.html.twig', [
"series" => $series
]);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我想检查用户是否具有角色ROLE_ADMIN或权限PERM_ACCESS_SERIES,但我不知道如何在我的选民中进行。
有关信息,“ROLE_ADMIN”是在我的 security.yaml 配置中设置的,但我想让这些角色动态化,以便能够创建角色(并为角色分配权限?)。
在我的 Voter 类中,当我控制一个 Document 时,我会检查所有者和其他可以管理该 Document 的用户,但是当我不传递一个 Document 时,我真的不知道该怎么做。
只是获取用户的权限并检查请求的权限是否在他们中。类似的东西:
if (in_array($attribute, $user->getPermissions())) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
其实这是我的选民
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
//ADMIN and SUPER_ADMIN can do anything they want ! …Run Code Online (Sandbox Code Playgroud) 我想创建一个这样的模型。
{
"id": 7653,
"name": "Vortl 123",
"category": [
{
"name": "Electronic",
"url": "electronic",
"id": 1
}, {
"name": "Phone",
"url": "phone",
"id": 2
},
{
"name": "Mobile Phone",
"url": "mobile-phone",
"id": 3
}
}
Run Code Online (Sandbox Code Playgroud)
我使用 odm 参考文献创建了文档。代码就是这些。
这是产品类别。
/**
* @ApiResource
*
* @Document
*/
class Product
{
/**
* @ODM\Id(strategy="INCREMENT", type="integer")
*/
private $id;
/**
* @ODM\Field(type="string")
* @Assert\NotBlank
*/
public $name;
public function __construct()
{
$this->categories = new ArrayCollection();
}
/**
* @ODM\ReferenceMany(targetDocument=Category::class, inversedBy="product", cascade={"persist"}, storeAs="id")
*/ …Run Code Online (Sandbox Code Playgroud) doctrine-odm ×10
php ×7
doctrine-orm ×6
mongodb ×5
symfony ×5
doctrine ×2
caching ×1
document ×1
symfony4 ×1