我如何解决一个查询,我想从左表中获取右表中没有的所有数据?
左表:ID | NAME |日期 右表:ID | ID_left_table | NAME | DATE
由于我没有获得有关学说的经验,这让我感到困惑。
我的实体看起来像:
class NameData
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, nullable=false)
*/
private $name;
/**
* @var \DateTime
*
* @ORM\Column(name="date", type="datetime")
*/
private $date;
.
.
.
和
class ValueData
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="TestBundle\Entity\NameData")
*/
private $nameid;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, nullable=false)
*/
private $name;
/**
* @var \DateTime
*
* @ORM\Column(name="date", type="datetime")
*/
private $date;
.
.
.
答案 0 :(得分:0)
1)首先,将ValueData实体中的$ nameid属性注释修复为:
/**
* @ORM\ManyToOne(targetEntity="NameData")
* @ORM\JoinColumn(name="name_id", referencedColumnName="id")
**/
private $nameData;
这是关系的基本Doctrine注释映射,在本例中为 ManyToOne 。
2)修改valueData表以添加外键,方法是输入 php app / console doctrine:schema:update --force 或migrations
3)让Symfony为您的ValueData实体生成正确的setter和getter,方法是在控制台中运行命令 php app / console doctrine:generate:entities TestBundle:ValueData 。
4)然后,如果你需要在控制器中获取数据:
$valueData = $this->getDoctrine()->getRepository('TestBundle:ValueData')->find(1);//Find by ID 1 OR ->findAll() to get all records
$nameData = $valueData->getNameData(); //This line of code behind the scenes will
//join the valueData table with nameData, and get associated data
如果您在此过程中需要帮助,请添加评论。
修改强>
下面是查询构建器,用于选择所有没有任何ValueData的NameDatas:
$nameDataRepo = $this->getDoctrine()->getRepository('TestBundle:NameData');
$nameDatasWithoutDatavalues = $nameDataRepo->createQueryBuilder('nameData')
->leftJoin('nameData.dataValues', 'dataValue')
->where('dataValue.id IS NULL')
->getQuery()
->getResult
此外,请确保编写教义关系的双向部分,以便能够从父实体NameData.php访问子级:
/**
* @var \Doctrine\Common\Collections\ArrayCollection
*
* @ORM\OneToMany(targetEntity="ValueData", mappedBy="nameData")
*/
private $valueDatas;
/**
* Constructor
*/
public function __construct()
{
$this->valueDatas = new \Doctrine\Common\Collections\ArrayCollection();
}
在ValueData.php中,编辑$ nameData属性注释:
/**
* @ORM\ManyToOne(targetEntity="NameData", inversedBy="valueDatas")
* @ORM\JoinColumn(name="name_id", referencedColumnName="id")
**/
private $nameData;