【问题标题】:Left Join in Doctrine and Symfony在 Doctrine 和 Symfony 中左连接
【发布时间】:2016-05-06 19:21:21
【问题描述】:

您好,我正在尝试使用 Doctrine 在 Symfony 中进行左连接。 我已经尝试过这样做,但我的尝试失败了。 这是我要执行的 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")
 * })
 */

我在我的实体文件夹中创建了一个 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”,但没有成功。

提前致谢。

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案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();
    

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

    在 yaml 中:repositoryClass:AppBundle\Entity\VideoRepo

    在注释中:

    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity(repositoryClass="AppBundle\Entity\VideoRepository")
     */
    class Video
    {
        //...
    }
    

    请确保在此 VideoRepository 类中将 VideoLeftJoin 方法定义为公共方法。

    【讨论】:

      【解决方案2】:

      您需要告诉教义要为相应的实体类使用哪个存储库类,否则教义将使用其默认的。修改VideoEntity中的Entity注解:

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

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

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

      【讨论】:

      • 谢谢,我会试试的。已经阅读了文档,但我并不总是明白他们的意思:)
      【解决方案3】:

      下面的错误简单说

      未定义的方法“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();
         }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-04
        • 1970-01-01
        • 2020-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        相关资源
        最近更新 更多