左加入Doctrine和Symfony

时间:2016-05-06 19:21:22

标签: symfony doctrine-orm

您好我正试图在Sytrfony中使用Doctrine进行左连接。 我已经尝试过这样做,但我的尝试失败了。 这是我想要执行的MySQL代码。

SELECT alben.name,alben.alben_id
FROM alben
LEFT JOIN video
ON alben.alben_id =video.album

在实体"视频"我定义了这样的$ album。

/**
 * @var \Contentuser
 *
 * @ORM\ManyToOne(targetEntity="Album")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="album", referencedColumnName="alben_id")
 * })
 */

我在Entity文件夹中创建了一个VideoRepository。

$qm = $this->createQueryBuilder()
        ->select("alben.name,alben.alben_id")
        ->from("alben")
        ->leftJoin("video","video","alben.alben_id =video.album");

        return $qm->getQuery()->getResult();

这是控制器部分:

$em=$this->getDoctrine()->getManager();
    $videoRepo=$em->getRepository('AppBundle:Video');
    $videos=$videoRepo->VideoLeftJoin();

我收到此错误 "未定义的方法' VideoLeftJoin'。方法名称必须以findBy或findOneBy开头! " 所以我试着添加" findBy"但它没有用。

先谢谢。

3 个答案:

答案 0 :(得分:1)

你想念“WITH”吗?

$qm = $this->createQueryBuilder()
->select("alben.name","alben.alben_id") 
->from("alben") 
->leftJoin("video","video", "WITH", "alben.alben_id =video.album");
return $qm->getQuery()->getResult();

你必须告诉学说有存储库:

in yaml:repositoryClass:AppBundle\Entity\VideoRepo

注释中的

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="AppBundle\Entity\VideoRepository")
 */
class Video
{
    //...
}

确保在此VideoRepository类中将VideoLeftJoin方法定义为public。

答案 1 :(得分:0)

您需要告诉doctrine将哪个存储库类用于相应的实体类,否则doctrine将使用其默认类。修改Entity实体中的Video注释:

/**
 * @ORM\Entity(repositoryClass="VideoRepositoryClassNameWithNamespace")
 * @ORM\Table
 */
class Video
{
...

其中VideoRepositoryClassNameWithNamespace是存储库类的完整路径。您必须自己定义VideoLeftJoin方法。

另外,请检查Database and Doctrinethe Query Builder documentation

答案 2 :(得分:0)

以下错误只是说

  

未定义的方法' VideoLeftJoin'。

然后消化你使用预定义的方法之一

  

方法名称必须以findBy或findOneBy!

开头

解决此错误

确保您的视频存储库中包含 VideoLeftJoin 功能。以下是如何创建它的示例。

 public function VideoLeftJoin()
   {
     return $this
        ->createQueryBuilder()
        ->select("alben.name,alben.alben_id")
         ->from("alben")
        ->leftJoin("video","video","alben.alben_id =video.album");
        ->getQuery()
        ->getResult();
   }