您好我正试图在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"但它没有用。
先谢谢。
答案 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 Doctrine和the 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();
}