[英]Symfony2/Doctrine: SQL to DQL for a querybuilder in a repository to make a search form
[英]Symfony2 QueryBuilder SQL to DQL
有人可以幫助我將SQL轉換為有效的Doctrine DQL代碼嗎?
SELECT * FROM tasks WHERE (SELECT COUNT(*) FROM tasks_done WHERE tasks_done.user_id = $userid AND tasks_done.task_id = tasks.id) = 1 AND tasks.user = $userid
我試過的
$em = $this->getDoctrine()->getManager();
$qb = $em->createQuery("
SELECT
t
FROM
tasks t
WHERE
t.id IN (
SELECT
td
FROM
TaskDone td
WHERE
td.task_id = t.id
AND
td.user_id = $id
)
AND
t.user = $id
");
$taskDone = $qb->getResult();
這引發以下異常:
[語義錯誤]第0行,第71列靠近“任務t”:錯誤:未定義類“任務”。
我的實體稱為:Task.php和TaskDone.php,類名與文件名相同。 表名稱是:task和task_done
編輯
結構TaskDone.php實體
<?php
命名空間Seotool \\ MainBundle \\ Entity;
使用Doctrine \\ Common \\ Collections \\ ArrayCollection; 使用Doctrine \\ ORM \\ Mapping作為ORM;
/**
* @ORM\Entity
* @ORM\Table(name="task_done")
*/
class TaskDone
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* @ORM\Column(type="integer")
*/
private $task_id;
/**
* @ORM\Column(type="integer")
*/
private $user_id;
/**
* Set task_id
*
* @param integer $taskId
* @return TaskDone
*/
public function setTaskId($taskId)
{
$this->task_id = $taskId;
return $this;
}
/**
* Get task_id
*
* @return integer
*/
public function getTaskId()
{
return $this->task_id;
}
/**
* Set user_id
*
* @param integer $userId
* @return TaskDone
*/
public function setUserId($userId)
{
$this->user_id = $userId;
return $this;
}
/**
* Get user_id
*
* @return integer
*/
public function getUserId()
{
return $this->user_id;
}
}
結構Task.php實體
<?php
namespace Seotool\MainBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="tasks")
*/
class Task {
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string")
*/
protected $task_title;
/**
* @ORM\Column(type="text")
*/
protected $task_description;
/**
* @ORM\Column(type="string")
*/
protected $task_priority;
/**
* @ORM\ManyToOne(targetEntity="TaskTypes", inversedBy="task")
* @ORM\JoinColumn(name="tasktype", referencedColumnName="id")
*/
protected $TaskTypes;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="task")
* @ORM\JoinColumn(name="user", referencedColumnName="id")
*/
protected $User;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set task_title
*
* @param string $taskTitle
* @return Task
*/
public function setTaskTitle($taskTitle)
{
$this->task_title = $taskTitle;
return $this;
}
/**
* Get task_title
*
* @return string
*/
public function getTaskTitle()
{
return $this->task_title;
}
/**
* Set task_description
*
* @param string $taskDescription
* @return Task
*/
public function setTaskDescription($taskDescription)
{
$this->task_description = $taskDescription;
return $this;
}
/**
* Get task_description
*
* @return string
*/
public function getTaskDescription()
{
return $this->task_description;
}
/**
* Set task_priority
*
* @param string $taskPriority
* @return Task
*/
public function setTaskPriority($taskPriority)
{
$this->task_priority = $taskPriority;
return $this;
}
/**
* Get task_priority
*
* @return string
*/
public function getTaskPriority()
{
return $this->task_priority;
}
/**
* Set TaskTypes
*
* @param \Seotool\MainBundle\Entity\TaskTypes $taskTypes
* @return Task
*/
public function setTaskTypes(\Seotool\MainBundle\Entity\TaskTypes $taskTypes = null)
{
$this->TaskTypes = $taskTypes;
return $this;
}
/**
* Get TaskTypes
*
* @return \Seotool\MainBundle\Entity\TaskTypes
*/
public function getTaskTypes()
{
return $this->TaskTypes;
}
/**
* Set User
*
* @param \Seotool\MainBundle\Entity\User $user
* @return Task
*/
public function setUser(\Seotool\MainBundle\Entity\User $user = null)
{
$this->User = $user;
return $this;
}
/**
* Get User
*
* @return \Seotool\MainBundle\Entity\User
*/
public function getUser()
{
return $this->User;
}
}
編輯2
我控制器的當前代碼,結果是一個空數組:
$em = $this->getDoctrine()->getManager();
$qb = $em->createQuery("
SELECT
t
FROM
SeotoolMainBundle:Task t
WHERE
t.id IN (
SELECT
td
FROM
SeotoolMainBundle:TaskDone td
WHERE
td.task_id = t.id
AND
td.user_id = $id
)
AND
t.User = $id
");
$taskDone = $qb->getResult();
$done = print_r($taskDone, true);
表TaskDone具有條目(ID 1 |任務ID 36 |用戶ID 13)存在ID為36的任務。
我認為您的查詢應該更簡單。
你到底想要什么? 所有由特定用戶完成的任務?
因此,如果您將這兩個表連接起來並在taskDone.user上進行過濾,則它應該可以工作。
讓我們嘗試一下。
SELECT
t
FROM
SeotoolMainBundle:Tasks t, SeotoolMainBundle:TaskDone td
WHERE
t.id=td.task_id
AND
td.user = $userid
(不確定我給您表指定的名稱,我不確定)
也許,我不明白你想要什么。 如果是這樣,請更准確;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.