标签: dql

Symfony2和Doctrine - 错误:无效的PathExpression.必须是StateFieldPathExpression

我有一个看起来像这样的实体:

/**
 * @Gedmo\Tree(type="nested")
 * @ORM\Table(name="categories")
 * @ORM\Entity()
 */
class Category extends BaseCategory
{

    /**
    * @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
    */
    protected $children;

    /**
    * @Gedmo\TreeParent
    * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
    * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="SET NULL")
    */
    protected $parent;

}
Run Code Online (Sandbox Code Playgroud)

我试图运行这样的查询:

$qb = $this->em->createQueryBuilder()
            ->select('c.parent')
            ->from('Category', 'c');

$result = $qb->getQuery()->getArrayResult();
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

[Semantical Error] ... Error: Invalid PathExpression. Must be a StateFieldPathExpression. 
Run Code Online (Sandbox Code Playgroud)

如何从表中选择parent_id字段.我尝试了很多变化,即使我做了这样的事情:

$qb = $this->em->createQueryBuilder()
            ->select('c')
            ->from('Category', 'c');
Run Code Online (Sandbox Code Playgroud)

除了 parent_id 之外,我得到表中的所有字段.这似乎是学说正在阻碍.如何查询此parent_id字段?或者更好的是如何获得表中的所有字段,包括parent_id

dql symfony doctrine-orm

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

如何在Doctrine查询中将null值指定为过滤器?

我在Zend中使用Doctrine 1.1.我正在尝试编写一个查询,该查询将返回某列中具有空值的记录.

    $q = Doctrine_Query::create()
    ->select('a.*')
    ->from('RuleSet a')
    ->where('a.vertical_id = ?', null);

    $ruleset_names_result = $q->execute(array(), Doctrine::HYDRATE_ARRAY);
Run Code Online (Sandbox Code Playgroud)

我在ruleset表中有三条记录,它们在vertical_id列中具有NULL值,但查询找不到这些记录.

感谢帮助.

希德.

php null doctrine dql

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

如何在Doctrine 2 DQL中使用now()?

$ php app/console doctrine:query:dql'SELECT now()'

[Doctrine\ORM\Query\QueryException] [语法错误]第0行,第7行:错误:预期的已知函数,得到'现在'

如何在Doctrine DQL中使用MySQL now()函数?

mysql dql symfony doctrine-orm

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

Symfony登录用户的id

我正在使用Symfony2和doctrine 2开发一个应用程序.我想知道如何获得当前登录用户的ID.

dql symfony doctrine-orm

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

使用PHP Doctrine ORM的复杂WHERE子句

我正在使用PHP Doctrine ORM来构建我的查询.但是,我似乎无法想象如何使用DQL(Doctrine查询语言)编写以下WHERE子句:

WHERE name='ABC' AND (category1 = 'X' OR category2 = 'X' OR category3 = 'X') 
AND price > 10
Run Code Online (Sandbox Code Playgroud)

如何指定括号的位置?

我目前在PHP代码中拥有的是:

->where('name = ?', 'ABC')
->andWhere('category1 = ?', 'X')
->orWhere('category2 = ?', 'X')
->orWhere('category3 = ?', 'X')
->andWhere('price > ?', 10)
Run Code Online (Sandbox Code Playgroud)

但这会产生类似的东西

WHERE name='ABC' AND category1 = 'X' OR category2 = 'X' OR category3 = 'X' 
AND price > 10
Run Code Online (Sandbox Code Playgroud)

由于操作顺序,它不会返回预期的结果.

另外,"where","andWhere"和"addWhere"方法之间是否存在差异?

更新 好的,好像你不能使用DQL进行复杂的查询,所以我一直在尝试手动编写SQL并使用andWhere()方法来添加它.但是,我正在使用WHERE..IN和Doctrine似乎正在剥离我的括号括起来:

$q->andWhere("(category1 IN $subcategory_in_clause
            OR category2 IN $subcategory_in_clause 
            OR category3 IN $subcategory_in_clause)");
Run Code Online (Sandbox Code Playgroud)

php mysql doctrine dql

38
推荐指数
2
解决办法
3万
查看次数

学说2 - 如何在where子句中使用discriminator列

我在where子句中使用了discriminator列,如下所示:

//f = root entity
$qb = $this->createQueryBuilder('f');
$qb->add('where', 'f.format = \'image\' OR f.format = \'text\'');
Run Code Online (Sandbox Code Playgroud)

我有一个错误:"消息:[语义错误]第0行,第73行'format ='image'':错误:类实体\文件\ AbstractFile没有字段或关联命名格式"

我怎样才能在where子句中使用discriminator列?

谢谢.

php dql doctrine-orm discriminator

36
推荐指数
2
解决办法
2万
查看次数

将条件数组传递给doctrine expr() - > orx()方法

我需要用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?任何想法如何解决这个,可能是常见的问题?

php oop doctrine dql doctrine-orm

34
推荐指数
4
解决办法
2万
查看次数

如何随机选择学说

以下是我在数据库中查询某些单词的方法

$query = $qb->select('w')
    ->from('DbEntities\Entity\Word', 'w')
    ->where('w.indictionary = 0 AND w.frequency > 3')
    ->orderBy('w.frequency', 'DESC')
    ->getQuery()
    ->setMaxResults(100);
Run Code Online (Sandbox Code Playgroud)

我正在使用mysql,我想获得符合条件的随机行,我会在查询中使用rand()命令.

我发现这个类似的问题基本上表明,因为在学说中不支持ORDER BY RAND,你可以随机化主键.但是,这不能在我的情况下完成,因为我有一个搜索条件和一个where子句,以便不是每个主键都满足该条件.

我还发现了一个代码片段,建议你使用OFFSET随机化行,如下所示:

$userCount = Doctrine::getTable('User')
     ->createQuery()
     ->select('count(*)')
     ->fetchOne(array(), Doctrine::HYDRATE_NONE); 
$user = Doctrine::getTable('User')
     ->createQuery()
     ->limit(1)
     ->offset(rand(0, $userCount[0] - 1))
     ->fetchOne();
Run Code Online (Sandbox Code Playgroud)

我有点困惑的是,这是否会帮助我解决在我的情况下随机缺乏对订单的支持.我无法在setMaxResult之后添加偏移量.

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

php dql doctrine-orm

32
推荐指数
6
解决办法
5万
查看次数

doctrine2 dql,在进行类似比较时使用带有%wildcard的setParameter

我想使用参数占位符 - 例如?1 - 与%外卡.也就是说,"u.name LIKE%?1%"(虽然这会引发错误).文档有以下两个例子:1.

// Example - $qb->expr()->like('u.firstname', $qb->expr()->literal('Gui%'))
public function like($x, $y); // Returns Expr\Comparison instance
Run Code Online (Sandbox Code Playgroud)

我不喜欢这样,因为没有针对代码注入的保护.

2.

// $qb instanceof QueryBuilder

// example8: QueryBuilder port of: "SELECT u FROM User u WHERE u.id = ?1 OR u.nickname LIKE ?2 ORDER BY u.surname DESC" using QueryBuilder helper methods
$qb->select(array('u')) // string 'u' is converted to array internally
   ->from('User', 'u')
   ->where($qb->expr()->orx(
       $qb->expr()->eq('u.id', '?1'),
       $qb->expr()->like('u.nickname', '?2')
   ))
   ->orderBy('u.surname', 'ASC'));
Run Code Online (Sandbox Code Playgroud)

我不喜欢这个,因为我需要在对象的属性中搜索术语 - 也就是说,我需要两侧的外卡.

wildcard code-injection dql doctrine-orm sql-like

28
推荐指数
2
解决办法
3万
查看次数

使用fetch-joined集合限制doctrine查询?

我有一个返回博客帖子及其评论的学说查询:

SELECT b, c FROM BlogPost b LEFT JOIN b.comments c
Run Code Online (Sandbox Code Playgroud)

我想将结果限制在10篇博文中.根据DQL文档,setMaxResults()对于获取加入集合的查询(在这种情况下为注释)无法正常工作:

如果您的查询包含一个fetch-joined集合,指定结果限制方法无法正常工作.设置最大结果限制数据库结果行的数量,但是对于fetch-joined集合,一个根实体可能出现在许多行中,有效地保湿少于指定数量的结果.

如何正确限制包含fetch-joined集合的doctrine查询(在这种情况下,将结果限制为10篇博文)?

doctrine limit dql

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