[英]DQL with JOIN Doctrine2 and Symfony2
您好我有兩張桌子:產品和庫存。 他們有很多關系,看起來像這樣:
股票:
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| stock_name | varchar(255) | NO | | NULL | |
| address | varchar(255) | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+
產品介紹:
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| stock_id | int(11) | YES | MUL | NULL | |
| name | varchar(255) | NO | | NULL | |
| delivery | varchar(255) | NO | | NULL | |
+----------+--------------+------+-----+---------+----------------+
實體
class Products
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string")
*/
private $name;
/**
* @ORM\Column(type="string")
*/
private $delivery;
/**
* @ORM\ManyToOne(targetEntity="Stock", inversedBy="products")
* @ORM\JoinColumn(nullable=true)
*/
private $stock;
/**
* @return mixed
*/
public function getName()
{
return $this->name;
}
/**
* @param mixed $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* @return mixed
*/
public function getDelivery()
{
return $this->delivery;
}
/**
* @param mixed $delivery
*/
public function setDelivery($delivery)
{
$this->delivery = $delivery;
}
/**
* @return mixed
*/
public function getStock()
{
return $this->stock;
}
/**
* @param mixed $stock
*/
public function setStock(Stock $stock)
{
$this->stock = $stock;
}
/**
* @return mixed
*/
public function getId()
{
return $this->id;
}
}
class Stock
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string")
*/
private $stock_name;
/**
* @ORM\Column(type="string")
*/
private $address;
/**
* @ORM\OneToMany(
* targetEntity="Products",
* mappedBy="stock",
* orphanRemoval=true
* )
*/
private $products;
/**
* @return mixed
*/
public function getStockName()
{
return $this->stock_name;
}
/**
* @param mixed $stock_name
*/
public function setStockName($stock_name)
{
$this->stock_name = $stock_name;
}
/**
* @return mixed
*/
public function getAddress()
{
return $this->address;
}
/**
* @param mixed $address
*/
public function setAddress($address)
{
$this->address = $address;
}
/**
* @return mixed
*/
public function getId()
{
return $this->id;
}
/**
* @return mixed
*/
public function getProducts()
{
return $this->products;
}
/**
* @param mixed $products
*/
public function setProducts($products)
{
$this->products = $products;
}
}
我需要sql,它給我所有與庫存ID 1相關聯的交貨地址,並在表格庫中僅將1個庫存地址添加到ID 1下。 該數組應如下所示:
Array (
[0] => Stock Address
[1] => delivery1
[2] => delivery2
[3] => delivery3
)
我嘗試這個語句,但它在數組中給出了多個庫存地址和數組:
$qb = $this->getEntityManager()->createQuery(
"SELECT o.delivery , p.address
FROM AppBundle:Products o
JOIN o.stock p
WHERE o.stock =1
");
return $qb->getScalarResult();
以及本聲明的結果:
Array (
[0] => Array (
[delivery] => Spoon str, USA
[address] => Wall street 1, USA
)
[1] => Array (
[delivery] => Lincoln street, USA
[address] => Wall street 1, USA
)
)
您將無法通過一個DQL語句直接檢索所需的數組。 原因是您實際上希望示例中提取的四行來自兩個不同的列。
所以你需要以某種方式處理結果。 例如,您可以將代碼段更改為:
$qb = $this->getEntityManager()->createQuery(
"SELECT o.delivery , p.address
FROM AppBundle:Products o
JOIN o.stock p
WHERE o.stock = 1
");
$result = $qb->getScalarResult();
return array_merge([$result[0]['address']], array_column($result, 'delivery'));
因此,您將地址作為要返回的數組的第一個元素,並僅添加所有結果的傳遞列,並添加它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.