我正在搜索,无法找到答案.我的应用程序中有数据库角色模型.用户可以拥有角色,但必须将此角色存储到数据库中.
但是,用户需要从数据库中添加默认角色.所以我创建了一个服务:
<?php
namespace Alef\UserBundle\Service;
use Alef\UserBundle\Entity\Role;
/**
* Description of RoleService
*
* @author oracle
*/
class RoleService {
const ENTITY_NAME = 'AlefUserBundle:Role';
private $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public function findAll()
{
return $this->em->getRepository(self::ENTITY_NAME)->findAll();
}
public function create(User $user)
{
// possibly validation here
$this->em->persist($user);
$this->em->flush($user);
}
public function addRole($name, $role) {
if (($newrole = findRoleByRole($role)) != null)
return $newrole;
if (($newrole = findRoleByName($name)) != null)
return $newrole;
//there is no existing role …Run Code Online (Sandbox Code Playgroud) Doctrine使用代理对象来表示相关对象,以便于延迟加载.这是一个非常酷的功能,但它导致我试图完成的事情的问题.
我已经定制了我的用户对象,因此它们都需要与不同的对象相关联,我称之为城市.这种关系很好.
我有一个表单,我的用户填写以生成另一个对象,街道.街道也与城市对象有关.我没有让用户在填写表单时选择城市,而是在将对象持久保存到数据库之前自动设置它.
我尝试使用$event->setCity($user->getCity()),但由于$ user-> getCity()返回一个代理对象,这会产生错误.有没有我可以从代理对象调用的函数来获取真实的函数?
注意:我知道我可以创建一个带有连接的自定义查询来强制学说实际加载相关对象,但由于这是用户(使用FOSUserBundle),这将很难正确执行.
可能重复:
如何将依赖项注入Symfony控制台命令?
我想制作控制台应用程序,它会从数据库中更改一些记录(每小时使用Cron).如何在这里获得Doctrine ORM实例?
在休闲控制器中,我这样做:
$this->getDoctrine();
Run Code Online (Sandbox Code Playgroud) 我正在使用FormType作为我的实体,并设置实体字段.我在And中需要两个Where子句,而且从我在Query Builder页面上看到的内容来看,这至少是我应该如何去做的:
'query_builder' => function ($er){
$qb = $er->createQueryBuilder('p');
$qb
->where($qb->expr()->andx(
$qb->expr()->in('p', '?1'),
$qb->expr()->not(
$qb->expr()->eq('p.location', 'NULL')
)
))
->setParameter(1, $this->totalScope)
;
return $qb;
},
Run Code Online (Sandbox Code Playgroud)
但是,Where它没有达到预期的结果(事实上,错误与"错误:预期的文字,得到'空''"
假设我有一个实体,它引用自己来映射父子关系
class Food
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Food", inversedBy="foodChildren")
* @ORM\JoinColumn(name="food_group_id", nullable=true)
*/
protected $foodGroup;
/**
* @ORM\OneToMany(targetEntity="Food", mappedBy="foodGroup", fetch="LAZY", cascade={"remove"})
*/
protected $foodChildren;
Run Code Online (Sandbox Code Playgroud)
我有一个用例,我希望得到food_group_id一个实体而不从数据库中获取完整的父对象.使用fetch="LAZY"不会让Doctrine再次查询.在获得时有没有办法只返回ID $food->getFoodGroup()?
让我们说我有一张桌子,里面有关于节日的信息.
每个节日都有开始和结束日期.
我想选择在给定日期生活(发生)的所有节日.
这意味着,我想选择他们的开始日期在给定日期之前或之后的所有节日,以及他们的结束日期是在同一日期之后或之后.
所以我继续了节日实体的存储库类,并创建了一个方法来做到这一点.
但是标准参数"findBy"期望的是一个数组,所有的例子都只将其视为一个简单的标准(例如"array('name'=>'billy')"将选择所有具有billy值的行. name column),它只使用比较运算符.
我怎样才能使用其他运算符
>, <, !=, IN, NOT IN, LIKE
Run Code Online (Sandbox Code Playgroud)
等等. ?
谢谢
我正在尝试使用注释创建Doctrine2/Symfony2中的表的简单索引,我收到以下错误:
[语义错误]类{My\Namespaces\Here}中的注释"@Index"从未导入.您是否忘记为此注释添加"使用"语句?
我在任何文档中都找不到我应该"使用"添加索引功能的命名空间.这是我的注释:
@ORM\Table(indexes={@Index(name="email_address_idx", columns={"email_address"})})
Run Code Online (Sandbox Code Playgroud)
以下是我已经使用的命名空间:
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints as DoctrineAssert;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Component\Validator\Constraints as Assert;
Run Code Online (Sandbox Code Playgroud)
我需要使用什么命名空间来添加此功能?
我需要用QueryBuilder这样的方法构造DQL
[QUERY]... AND WHERE e.type = x OR e.type = Y OR e.type = N [...]
Run Code Online (Sandbox Code Playgroud)
我有数组类型如何将此数组传递给我的查询生成器?
$qb->andWhere($qb->expr()->orx(CONDITIONS));
Run Code Online (Sandbox Code Playgroud)
类型列表将是动态的,调用$qb->andWhere每个foreach类型循环只会使更多AND WHERE不再是OR.
我可以存储乘法orx表达式然后将其添加到andWhere?任何想法如何解决这个,可能是常见的问题?
我在Symfony2中使用Doctrine的querybuilder创建一个查询来获取实体.
我当前的代码如下所示:
$repository = $this->getDoctrine()->getRepository('AaaBundle:Application');
$queryBuilder = $repository->createQueryBuilder('a');
$queryBuilder
->addSelect('u')
->addSelect('i')
->orderBy('a.created_date', 'DESC')
->leftJoin('a.created_by', 'u')
->leftJoin('a.installations', 'i')
//->where('i.page = :page')
//->setParameter('page', $found)
;
Run Code Online (Sandbox Code Playgroud)
现在我可以使用它来获取所有页面,无论它们是否安装.但我只想加入它们$found页面可用(所以如果有应用程序的安装,但它在另一个页面上,安装将不会加入).如果我取消引用where子句,它将仅显示具有该页面安装的应用程序.我希望所有应用程序都有或没有安装页面.
在SQL中,我可以通过添加AND到连接来获得此功能
LEFT JOIN installations i ON a.id = i.app AND i.page = :page
Run Code Online (Sandbox Code Playgroud)
这样我就可以获得在页面上安装了应用程序的应用程序的安装信息,但是我在其他页面上安装或根本没有安装的应用程序的列上获得空值.
有没有办法在Doctrine中执行此操作,或者我最好只为每个应用程序获取所有安装,然后使用php检查找到的页面?
我是Symfony2的新手,我通过QueryBuilder和Doctrine 2成功构建了我的第一个连接.可能这是一个愚蠢的问题但是在线和Symfony2的方法中我都无法找到任何理解join子句之间的区别的东西"用"和"开".
例如,这是我的加入代码:
->leftJoin('EcommerceProductBundle:ProductData', 'pdata', 'WITH', 'prod.id = IDENTITY(pdata.product)')
Run Code Online (Sandbox Code Playgroud)
它工作正常,但如果我把ON而不是WITH我得到以下错误:
[语法错误]第0行,第200行:错误:预期的Doctrine\ORM\Query\Lexer :: T_WITH,得到'ON'
为什么?我在对象中看到T_ON和T_WITH都有join子句,但是它们的使用区别是什么?他们的用途是什么样的?