如果帖子和标签之间存在多对多关系,我该如何选择包含特定标签的帖子?
更新:
我遇到的问题是,由于 where tag.name = 'xxx'
,只选择了那个标签。我想要的是选择所有指定了标签的帖子,tgt 及其所有标签,例如。
Post 1 -> tag1, tag2
Post 2 -> tag1, tag3
Post 3 -> tag2, tag3
Run Code Online (Sandbox Code Playgroud)
目前我得到的是
Post 1 -> tag2 // missing tag1
Post 3 -> tag2 // missing tag3
Run Code Online (Sandbox Code Playgroud) symfony框架具有app/console文件,可以通过php执行以执行一些维护任务.它还允许用户运行DQL查询:
# php app/console doctrine:query:dql --hydrate=array \
'SELECT u.id, u.nameFirst, u.nameLast FROM DatabaseBundle:User u'
array
0 =>
array
'id' => string '1' (length=1)
'nameFirst' => string 'jaroslav' (length=8)
'nameLast' => string 'rakhmatoullin' (length=13)
1 =>
array
'id' => string '2' (length=1)
'nameFirst' => string 'Båb Kåre' (length=10)
'nameLast' => string 'Ytrefoss' (length=8)
Run Code Online (Sandbox Code Playgroud)
观察我选择了三个特定的列.我遇到的问题是,当两个表连接时,类似的查询会给我一个错误.
# php app/console doctrine:query:dql --hydrate=array \
'SELECT u.id , r FROM DatabaseBundle:User u JOIN u.roles r'
[Doctrine\ORM\Query\QueryException]
[Semantical Error] line 0, col -1 near 'SELECT u.id ,': …
Run Code Online (Sandbox Code Playgroud) 我使用Symfony 2和Doctrine.在我的数据库MySQL中,我有一个类型的字段DateTime
.在我的Repository文件中,通过使用QueryBuilder
,我想在我的Where
子句中仅按日期(没有时间)和仅按时间(没有日期)搜索此表.
我怎么能意识到这一点?
我在本机MySQL代码中有这个查询
SELECT *
FROM `turn`
LEFT JOIN (
poi
) ON ( turn.id = poi.turn_id )
GROUP BY turn.id
ORDER BY count( case when poi.image = 1 then 1 else null end) DESC;
Run Code Online (Sandbox Code Playgroud)
我需要在Doctrine 2 DQL中重建它
到目前为止我的尝试是这样的:
SELECT t, COUNT((CASE WHEN Bundle\Entity\Poi p.image = 1 then 1 ELSE NULL END)) AS num
FROM Bundle\Entity\Turn t
JOIN t.pois p
GROUP BY t.id
ORDER BY num DESC
Run Code Online (Sandbox Code Playgroud)
我得到这个错误:
An exception has been thrown during the rendering of a template ("[Syntax Error] line …
如何在doctrine2中将以下SQL查询编写为DQL.
SELECT COUNT(id)
FROM stats
WHERE YEAR(record_date) = 2009
GROUP BY YEAR(record_date), MONTH(record_date)
Run Code Online (Sandbox Code Playgroud)
即我希望group by
结果基于存储在MySQL表中的月份,日期时间字段的年份.
我用这样的实体类型构建一个表单:
$form = $this->createFormBuilder()
->add('users', 'entity', array(
'class' => 'UserBundle:Users',
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('u')
->orderBy('u.name', 'ASC');
},)
)
->getForm();
Run Code Online (Sandbox Code Playgroud)
现在我想修改此表单,仅显示不同的用户.我试试这个:
->add('users', 'entity', array(
'class' => 'UserBundle:Users',
'query_builder' => function(EntityRepository $er) {
return $er->createQuery('SELECT DISTINCT u.name FROM UserBundle:Users ORDER BY u.name ASC')->getResult();
},)
)
Run Code Online (Sandbox Code Playgroud)
但是Symfony给了我一个例外.我的问题是如何在实体字段类型中使用自定义查询?
我不明白你的意思是什么意思.我的代码看起来像:
库:
public function getDistinctUsers()
{
return $this->getEntityManager()->createQuery('SELECT DISTINCT u.name FROM UserBundle:Users u ORDER BY u.name DESC')->getResult();
}
Run Code Online (Sandbox Code Playgroud)
控制器:
->add('users', 'entity', array(
'class' => 'UserBundle:Users',
'query_builder' => function(EntityRepository $er) {
return $er->getDistinctUsers();
},) …
Run Code Online (Sandbox Code Playgroud) 试图将我的SQL查询转换为dql,似乎我做错了.
我需要基本的连接,就像这样.
SELECT a.id, a.title, u.name FROM articles JOIN users ON a.author_id = u.id
Run Code Online (Sandbox Code Playgroud)
试着
SELECT a.id, a.title, u.name FROM Article a JOIN User u WITH a.author_id = u.id
Run Code Online (Sandbox Code Playgroud)
得到错误
[Semantical Error] line 0, col 34 near 'Article a JOIN': Error: Class 'Article' is not defined.
Run Code Online (Sandbox Code Playgroud)
我该如何定义?你能给我一个正确的解决方案吗?
编辑:
文章实体
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="articles")
*/
class Article
{
/**
* @var integer $id
*
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected …
Run Code Online (Sandbox Code Playgroud) 如果我在没有queryBuilder的情况下使用这个dql进行查询
$query = $this->_em
->createQuery("SELECT p, g, c
FROM LikeYeah\GoBundle\Entity\Product p
JOIN p.garments g
LEFT JOIN g.colours c
ORDER BY p.id DESC
");
Run Code Online (Sandbox Code Playgroud)
一切都很好,但如果我使用(我相信是相同的)查询槽查询生成器这样
$qb->select('p, g, c')
->from('LikeYeah\GoBundle\Entity\Product', 'p')
->join('p.garments', 'g')
->leftJoin('g.colours', 'c')
->orderBy('p.id', 'desc');
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
"语义错误"第0行,第66行靠近'.colours c,LikeYeah\GoBundle\Entity\Product':错误:识别变量g用于连接路径表达式,但之前没有定义过."
我错过了什么?
说我有以下课程:
class Store
{
/**
* @ManyToMany(targetEntity="PaymentMethod")
*/
protected $paymentMethods;
}
class PaymentMethod
{
}
Run Code Online (Sandbox Code Playgroud)
当我们删除(或只是禁用,而不是实际从数据库中删除)a时PaymentMethod
,我们希望paymentMethod
从所有Store::$paymentMethods
集合中删除它.
到目前为止,我们一直在联结表上使用原始SQL查询:
DELETE FROM StorePaymentMethod WHERE paymentMethodId = ?
Run Code Online (Sandbox Code Playgroud)
有没有办法在Doctrine中做到这一点,最好是在DQL中?
我有一个名为Auction的实体,其中包含两个datetime类型的字段:date1和date2.我想选择所有拍卖行,其中date1和date2之间的差异小于30分钟.如何使用Doctrine查询语言执行此操作?
DATE_DIFF(date1,date2)作为文档说明"计算date1-date2之间的天数差异".我需要差异的地方.
编辑:所以这里是自定义函数TIME_DIFF的完整实现:
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
/**
* Custom DQL function returning the difference between two DateTime values
*
* usage TIME_DIFF(dateTime1, dateTime2)
*/
class TimeDiff extends FunctionNode
{
/**
* @var string
*/
public $dateTime1;
/**
* @var string
*/
public $dateTime2;
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->dateTime1 = $parser->ArithmeticPrimary();
$parser->match(Lexer::T_COMMA);
$this->dateTime2 = $parser->ArithmeticPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
return 'TIME_TO_SEC(TIMEDIFF(' .
$this->dateTime1->dispatch($sqlWalker) . ', ' . …
Run Code Online (Sandbox Code Playgroud) dql ×10
symfony ×7
doctrine-orm ×5
doctrine ×4
datetime ×2
mysql ×2
php ×2
date ×1
entity ×1
many-to-many ×1