簡體   English   中英

Symfony2 QueryBuilder SQL到DQL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM