使用createNativeQuery连接没有外键的两个实体 [英] Using createNativeQuery to join two entities without foreign key

查看:163
本文介绍了使用createNativeQuery连接没有外键的两个实体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想根据一个字段(类型)的值从两个不同的表中检索数据。基本上,如果类型是2或3,将'subcategory_id'分别与category2或category3相关联

I want to retrieve data from two different tables depending of the value of one field (type). Basically if type is 2 or 3, relate 'subcategory_id' to category2 or category3 respectively

纯SQL:

SELECT s.id, s.subcategory_id, s.type, IF(s.type = 2, c2.name, c3.name) as name
                                   FROM show_subcategory s
                                   LEFT JOIN category2 c2 ON (s.type = 2 AND s.subcategory_id = c2.id)
                                   LEFT JOIN category3 c3 ON (s.type = 3 AND s.subcategory_id = c3.id)
                                   WHERE s.category1_id = 1 ORDER BY s.order_list

将DQL转换为Repository类: p>

The translation to DQL into Repository Class:

$em = $this->getEntityManager();
    $rsm = new ResultSetMapping;
    $rsm->addEntityResult('Acme\CoreBundle\Entity\ShowSubcategory', 's');
    $rsm->addFieldResult('s', 'id', 'id');
    $rsm->addFieldResult('s', 'subcategory_id', 'subcategoryId');
    $rsm->addFieldResult('s', 'type', 'type');
    $rsm->addFieldResult('s', 'order_list', 'orderList');

    $rsm->addJoinedEntityResult('Acme\CoreBundle\Entity\Category2' , 'c2', 's', 'category2');
    $rsm->addFieldResult('c2', 'id', 'id');
    $rsm->addFieldResult('c2', 'name', 'name');

    $rsm->addJoinedEntityResult('Acme\CoreBundle\Entity\Category3' , 'c3', 's', 'category3');
    $rsm->addFieldResult('c3', 'id', 'id');
    $rsm->addFieldResult('c3', 'name', 'name');

     $q = $em->createNativeQuery("SELECT s.id, s.subcategory_id, s.type, IF(s.type = 2, c2.name, c3.name) as name
                                   FROM show_subcategory s
                                   LEFT JOIN category2 c2 ON (s.type = 2 AND s.subcategory_id = c2.id)
                                   LEFT JOIN category3 c3 ON (s.type = 3 AND s.subcategory_id = c3.id)
                                   WHERE s.category1_id = ? ORDER BY s.order_list", $rsm);
    $q->setParameter(1, $category1);

    return $q->getResult();

在ShowSubcategory的实体中,我添加了两个新的属性来处理此查询(category2,category3):

In the entity for ShowSubcategory I added two new properties to handle with this query(category2, category3):

/**
 * @var integer $id
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @var integer $subcategoryId
 *
 * @ORM\Column(name="subcategory_id", type="integer", nullable=false)
 */
protected $subcategoryId;

/**
 * @var smallint $type
 *
 * @ORM\Column(name="type", type="smallint", nullable=false)
 */
protected $type;

/**
 * @var smallint $orderList
 *
 * @ORM\Column(name="order_list", type="smallint", nullable=true)
 */
protected $orderList;

/**
 * @var \Category1
 *
 * @ORM\ManyToOne(targetEntity="Acme\CoreBundle\Entity\Category1")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="category1_id", referencedColumnName="id")
 * })
 */
protected $category1;

/**
 * @var category2
 *
 * @ORM\ManyToOne(targetEntity="Acme\CoreBundle\Entity\Category2")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="subcategory_id", referencedColumnName="id")
 * })
 * @Assert\Blank()
 */
protected $category2;

/**
 * @var category3
 *
 * @ORM\ManyToOne(targetEntity="Acme\CoreBundle\Entity\Category3")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="subcategory_id", referencedColumnName="id")
 * })
 * @Assert\Blank()
 */
protected $category3;


/**
 * Get id
 *
 * @return integer
 */
public function getId()
{
    return $this->id;
}


/**
 * Set category1
 *
 * @param \Acme\CoreBundle\Entity\Category1 $category1
 * @return ShowSubcategory
 */
public function setCategory1(\Acme\CoreBundle\Entity\Category1 $category1 = null)
{
    $this->category1 = $category1;

    return $this;
}

/**
 * Get category1
 *
 * @return Acme\CoreBundle\Entity\Category1
 */
public function getCategory1()
{
    return $this->category1;
}

/**
 * Set subcategoryId
 *
 * @param integer $subcategoryId
 * @return ShowSubcategory
 */
public function setSubcategoryId($subcategoryId)
{
    $this->subcategoryId = $subcategoryId;

    return $this;
}

/**
 * Get subcategoryId
 *
 * @return integer
 */
public function getSubcategoryId()
{
    return $this->subcategoryId;
}

/**
 * Set type
 *
 * @param smallint $type
 * @return ShowSubcategory
 */
public function setType($type)
{
    $this->type = $type;

    return $this;
}

/**
 * Get type
 *
 * @return smallint
 */
public function getType()
{
    return $this->type;
}

/**
 * Set order
 *
 * @param smallint $OrderList
 * @return ShowSubcategory
 */
public function setOrderList($orderList)
{
    $this->orderList = $orderList;

    return $this;
}

/**
 * Get OrderList
 *
 * @return smallint
 */
public function getOrderList()
{
    return $this->orderList;
}

public function getCategory2()
{
    return $this->category2;
}

public function setCategory2(Category2 $category2 = null)
{
    $this->category2 = $category2;
    return $this;
}

public function getCategory3()
{
    return $this->category3;
}

public function setCategory3(Category3 $category3 = null)
{
    $this->category3 = $category3;
    return $this;
}

}

我收到这个错误:

Notice: Undefined index: id in /var/www/project/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 2402 

我不知道我试过了什么问题几个想法,但没有什么似乎工作。任何建议?
提前感谢

I don't know what is wrong I have tried several ideas, but nothing seems to work. Any suggestion?. Thanks in advance.

推荐答案

我想你必须明确地添加 id 在SELECT子句中:

I guess you have to explicitely add id in the SELECT clause :

SELECT s.id, s.subcategory_id, s.type, IF(s.type = 2, c2.name, c3.name) as name, c2.id as c2id, c3.id as c3id
    FROM show_subcategory s
    LEFT JOIN category2 c2 ON (s.type = 2 AND s.subcategory_id = c2.id)
    LEFT JOIN category3 c3 ON (s.type = 3 AND s.subcategory_id = c3.id)
    WHERE s.category1_id = ? ORDER BY s.order_list

然后调整ResultSet如下:

And adapt the ResultSet as following :

$rsm = new ResultSetMapping;
$rsm->addEntityResult('Acme\CoreBundle\Entity\ShowSubcategory', 's');
$rsm->addFieldResult('s', 'id', 'id');
$rsm->addFieldResult('s', 'subcategory_id', 'subcategoryId');
$rsm->addFieldResult('s', 'type', 'type');
$rsm->addFieldResult('s', 'order_list', 'orderList');

$rsm->addJoinedEntityResult('Acme\CoreBundle\Entity\Category2' , 'c2', 's', 'category2');
$rsm->addFieldResult('c2', 'c2id', 'id');
$rsm->addFieldResult('c2', 'name', 'name');

$rsm->addJoinedEntityResult('Acme\CoreBundle\Entity\Category3' , 'c3', 's', 'category3');
$rsm->addFieldResult('c3', 'c3id', 'id');
$rsm->addFieldResult('c3', 'name', 'name');

这篇关于使用createNativeQuery连接没有外键的两个实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆