簡體   English   中英

使用原理在Laravel中一對多的空集合

[英]Empty collection one-to-many in laravel using doctrine

我試圖將Loctavel與Doctrine結合使用,並且能夠進行所有映射並返回一些結果。 但是問題在於一對多關系,即多方ArrayCollection為空。

我有兩個類Project和Client,一個Client有很多Project。 在項目列表中,我確實成功返回了客戶端,但是在客戶端,Project數組為空。 這是我總結的Client類:

<?php
namespace CodeProject\Entities\Doctrine;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="clients")
 */
class Client implements \JsonSerializable {

     /**
      * @ORM\Column(type="integer")
      * @ORM\Id
      * @ORM\GeneratedValue(strategy="AUTO")
      */
     private $id;

    /**
     *
     * @ORM\OneToMany(targetEntity="Project", mappedBy="client")
     */
    private $projects;

    public function __construct() {
        $this->projects = new ArrayCollection();
    }
}

現在總結一下Project類:

<?php

namespace CodeProject\Entities\Doctrine;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="projects")
 */
class Project implements \JsonSerializable {

    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * 
     * @ORM\ManyToOne(targetEntity="Client", inversedBy="projects")
     * @ORM\JoinColumn(name="client_id", referencedColumnName="id")
     */
    private $client;
}

當我訪問控制器以獲取有關客戶端的信息時,將返回以下內容,請注意項目是一個空數組:

[
    {
        "id": 21,
        "name": "Dolores Osinski",
        "responsible": "Ashton Conn",
        "email": "Crist.Mario@gmail.com",
        "phone": "(936)177-7976",
        "address": "80311 Rossie Drives\nLake Brandyn, KS 39255-7560",
        "obs": "Aliquid harum architecto eum natus qui.",
        "created_at": "2017-03-19 16:33:39",
        "updated_at": "2017-03-19 16:33:39",
        "projects": {}
    }
]

在項目方面,您可以看到客戶:

[
    {
        "id": 1,
        "name": "tenetur",
        "description": "Animi ut enim voluptas. Provident alias aut animi nemo repellendus. A dolores magni ducimus sit ex.",
        "progress": "39.00",
        "status": 4,
        "due_date": "1972-10-26 12:56:38",
        "created_at": "2017-03-19 16:33:45",
        "updated_at": "2017-03-19 16:33:45",
        "client": {
            "id": 21,
            "name": "Dolores Osinski",
            "responsible": "Ashton Conn",
            "email": "Crist.Mario@gmail.com",
            "phone": "(936)177-7976",
            "address": "80311 Rossie Drives\nLake Brandyn, KS 39255-7560",
            "obs": "Aliquid harum architecto eum natus qui.",
            "created_at": "2017-03-19 16:33:39",
            "updated_at": "2017-03-19 16:33:39",
            "projects": {}
        }
    }
]

我想念什么?

更新

我的客戶資料庫:

<?php

namespace CodeProject\Repositories;

use Doctrine\ORM\EntityRepository;

class ClientRepositoryDoctrine extends EntityRepository {

    public function getProjects($id) {
        $client = $this->find($id);
        return $client->getProjects();
    }

}

在列出特定客戶項目的函數中,我的ClientController:

public function listProjects($id){
    return response()->json($this->repository->getProjects($id));
}

即使這樣,它也沒有列出任何內容。

在我的存儲庫中使用fetch join嘗試DQL:

<?php

namespace CodeProject\Repositories;

use Doctrine\ORM\EntityRepository;

class ClientRepositoryDoctrine extends EntityRepository {

    public function getProjects($id) {
        $result = $this->getEntityManager()->createQueryBuilder()->
            select('c, p')->
            from('CodeProject:Client', 'c')->
            join('c.projects', 'p')->
            where('c.id = :id')->
            setParameter(':id', $id)->getQuery()->getResult();
        return $result;
    }
}

我明白了,即使使用強制加入項目的fetch join,項目仍然是空的:

[
    {
        "id": 1,
        "name": "Mariam Jast",
        "responsible": "Imogene Schowalter",
        "email": "wHackett@gmail.com",
        "phone": "05482413294",
        "address": "062 Block Parkway\nMireyabury, KS 63554-2056",
        "obs": "Occaecati aperiam quibusdam maxime laboriosam aperiam sint.",
        "created_at": "2017-03-20 02:29:47",
        "updated_at": "2017-03-20 02:29:47",
        "projects": {}
    }
]

聽起來您從未加載該關系。 默認情況下,延遲加載OneToMany關系。

您可以通過執行需要數據庫調用的任何操作來觸發加載。 在此示例中,簡單的foreach就足夠了。

foreach($client->getProjects() as $project) {
    // ...
}

您還可以將關系配置為渴望加載。 資料來源: 21.2.26。 @OneToMany

/**
 * @OneToMany(..., fetch="EAGER")
 **/

這也可以是每個DQL查詢。 資料來源: 14.2.2。 加入

SELECT c, c.projects FROM Client c

關於Project.client的加載,可以是正在運行的實體映射。 您已經從實體管理器加載了客戶端,因此當Project實例顯示“我有client_id = 1”時,您的實體管理器會注意到已經加載了Client#1,並將其與Project.client關系相關聯。

另一種方法是不可能的,因為Doctrine無法知道您已經加載了客戶端可以擁有的所有可能項目。 唯一真正的發現方法是查詢數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM