Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 带有JOIN Doctrine2和Symfony2的DQL_Php_Mysql_Symfony_Join_Doctrine Orm - Fatal编程技术网

Php 带有JOIN Doctrine2和Symfony2的DQL

Php 带有JOIN Doctrine2和Symfony2的DQL,php,mysql,symfony,join,doctrine-orm,Php,Mysql,Symfony,Join,Doctrine Orm,你好,我有两张桌子:产品和存货。他们有很多种关系,看起来是这样的: 股票: +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ |

你好,我有两张桌子:产品和存货。他们有很多种关系,看起来是这样的:

股票:

+------------+--------------+------+-----+---------+----------------+
| 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,它可以为我提供与stock id 1关联的所有交付地址,并在stock表的id 1下只向该数组添加一个stock地址。该数组应该如下所示:

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'));

因此,您将地址作为要返回的数组的第一个元素,只添加所有结果的delivery列,并将其添加。

您谈论的是原则。实体定义在哪里?