Неожиданная коллекция вернулась в Symfony - PullRequest
0 голосов
/ 22 февраля 2019

Я создал объект Customer с отношением ManyToOne к Партнеру.Партнер имеет обратное отношение OneToMany к Клиенту.

Я звоню $partner->getCustomers(), и у меня есть результат, который в порядке, хотя я не могу что-то объяснить.Во-первых, вот запрос:

public function getCustomersByPartner(SerializerInterface $serializer, $id)
{
    /* @var $partner Partner */
    $partner = $this->getDoctrine()->getRepository(Partner::class)->find($id);
    $customers = $serializer->serialize($partner->getCustomers(), 'json');

    $response = new Response($customers);
    $response->headers->set('Content-Type', 'application/json');

    return $response;
}

А вот полный результат (при вызове маршрута хост / партнер / 3, где 3 - идентификатор партнера):

[
    {
        "id": 4,
        "url": "www.test.com",
        "subscription_status": "active",
        "first_payment": "2019-02-22T09:55:47+00:00",
        "created_at": "2019-02-22T09:55:47+00:00",
        "updated_at": "2019-02-22T09:55:47+00:00",
        "partner": {
            "id": 3,
            "firstname": "Partner3",
            "lastname": "Partner3",
            "authenticated": 1,
            "created_at": "2019-02-22T10:05:04+00:00",
            "updated_at": "2019-02-22T10:05:04+00:00",
            "customers": [
                {
                    "id": 9,
                    "url": "www.blabla.com",
                    "subscription_status": "active",
                    "first_payment": "2019-02-22T13:23:43+00:00",
                    "created_at": "2019-02-22T13:23:43+00:00",
                    "updated_at": "2019-02-22T13:23:43+00:00"
                }
            ]
        }
    },
    {
        "id": 9,
        "url": "www.blabla.com",
        "subscription_status": "active",
        "first_payment": "2019-02-22T13:23:43+00:00",
        "created_at": "2019-02-22T13:23:43+00:00",
        "updated_at": "2019-02-22T13:23:43+00:00",
        "partner": {
            "id": 3,
            "firstname": "Partner3",
            "lastname": "Partner3",
            "authenticated": 1,
            "created_at": "2019-02-22T10:05:04+00:00",
            "updated_at": "2019-02-22T10:05:04+00:00",
            "customers": [
                {
                    "id": 4,
                    "url": "www.test.com",
                    "subscription_status": "active",
                    "first_payment": "2019-02-22T09:55:47+00:00",
                    "created_at": "2019-02-22T09:55:47+00:00",
                    "updated_at": "2019-02-22T09:55:47+00:00"
                }
            ]
        }
    }
]

Я делаюесть все клиенты, принадлежащие идентификатору партнера 3 , но я ожидал, что в моем массиве customers (в обоих объектах "партнера") будет содержаться каждый клиент, присоединенный к этому партнеру (то есть, клиент 4 и клиент 9)в данном случае).

Я не могу выразить это словами, надеюсь, вы понимаете, о чем я.Вот что я ожидал:

"customers": [
                {
                    "id": 9,
                    "url": "www.blabla.com",
                    "subscription_status": "active",
                    "first_payment": "2019-02-22T13:23:43+00:00",
                    "created_at": "2019-02-22T13:23:43+00:00",
                    "updated_at": "2019-02-22T13:23:43+00:00"
                },
                {
                    "id": 4,
                    "url": "www.test.com",
                    "subscription_status": "active",
                    "first_payment": "2019-02-22T09:55:47+00:00",
                    "created_at": "2019-02-22T09:55:47+00:00",
                    "updated_at": "2019-02-22T09:55:47+00:00"
                }
            ]

Это потому, что Symfony сначала возвращает первого клиента, а затем показывает, что осталось?Это доктрина специфическое поведение?

Что забавно, если я сделаю обратное и посмотрю, какой клиент принадлежит какому партнеру, у меня будет возвращен этот результат: (вызов маршрута хост / клиент / 4, где 4 - идентификатор клиента)

{
    "id": 3,
    "firstname": "Partner3",
    "lastname": "Partner3",
    "authenticated": 1,
    "created_at": "2019-02-22T10:05:04+00:00",
    "updated_at": "2019-02-22T10:05:04+00:00",
    "customers": [
        {
            "id": 4,
            "url": "www.test.com",
            "subscription_status": "active",
            "first_payment": "2019-02-22T09:55:47+00:00",
            "created_at": "2019-02-22T09:55:47+00:00",
            "updated_at": "2019-02-22T09:55:47+00:00"
        },
        {
            "id": 9,
            "url": "www.blabla.com",
            "subscription_status": "active",
            "first_payment": "2019-02-22T13:23:43+00:00",
            "created_at": "2019-02-22T13:23:43+00:00",
            "updated_at": "2019-02-22T13:23:43+00:00"
        },
        {
            "id": 10,
            "url": "www.blabla.com",
            "subscription_status": "active",
            "first_payment": "2019-02-22T13:53:02+00:00",
            "created_at": "2019-02-22T13:53:02+00:00",
            "updated_at": "2019-02-22T13:53:02+00:00"
        }
    ]
}

И вот функция:

/**
 * @Route("/customer/{id}", name="customer_detail")
 * @param SerializerInterface $serializer Serializer service
 * @param Integer $id Id of customer
 * @return Response Return name of the partner
 */
public function getPartnerByCustomer(SerializerInterface $serializer, $id)
{
    /* @var $customer Customer */
    $customer = $this->getDoctrine()->getRepository(Customer::class)->find($id);
    $partner = $serializer->serialize($customer->getPartner(), 'json');

    $response = new Response($partner);
    $response->headers->set('Content-Type', 'application/json');

    return $response;
}

Это именно то, что я ожидал бы для первого запроса.Спасибо за ваше время.

...