Как получить данные из многих таблиц без специального запроса?

Ну, я создаю отношение ManyToMany, которое отлично работает, но когда я пытался получить данные, он возвращает мне пустой объект:

Как я пытался получить данные (Контроллер):

    $userRepo = $this->getDoctrine()->getRepository(User::class);
    $user = $this->getUser();
    $user = $userRepo->find($user->getId());
    $test = $user->getFavouriteArticles();
    dump($test); exit;

Пользовательская сущность:

<?php

namespace AppBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;

/**
 * @ORM\Entity(repositoryClass = "AppBundle\Repository\UserRepository")
 * @ORM\Table(name = "user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy = "AUTO")
     * @ORM\Column(type = "integer")
     */
    protected $id;

    /**
     * @ORM\Column(type = "string")
     */
    private $firstName;

    /**
     * @var favouriteArticles[]
     * @ORM\ManyToMany(targetEntity = "AppBundle\Entity\Article")
     * @ORM\JoinTable(name = "user_favourite_articles",
     *     joinColumns = {@ORM\JoinColumn(name = "user_id", referencedColumnName = "id")},
     *     inverseJoinColumns = {@ORM\JoinColumn(name = "article_id", referencedColumnName = "id")})
     */
    private $favouriteArticles;

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

    /**
     * @return favouriteArticles[]
     */
    public function getFavouriteArticles(): object
    {
        return $this->favouriteArticles;
    }

    /**
     * @param favouriteArticles[] $favouriteArticles
     */
    public function setFavouriteArticles(array $favouriteArticles): void
    {
        $this->favouriteArticles = $favouriteArticles;
    }

    /**
     * Add user
     *
     * @param \AppBundle\Entity\Article $article
     *
     * @return User
     */
    public function addFavouriteArticle(Article $article)
    {
        $this->favouriteArticles[] = $article;

        return $this;
    }

Как добавить статьи, избранные пользователем:

public function addToFavourites($category, $id)
{
    $em = $this->getDoctrine()->getManager();
    $article = $em->getRepository("AppBundle:Article")->find($id);
    $user = $this->getUser();
    $user = $em->getRepository("AppBundle:User")->find($user->getId());
    $user->addFavouriteArticle($article);
    $em->persist($user);
    $em->flush();

БД (таблица user_favourite_articles):

|user_id| article_id |
|____________________|
|    3  |      8     |
|    3  |      9     |

Текущий user_id равен 3

Результат из дампа, и я не могу показать favouriteArticles:

PersistentCollection {#7796 ▼
  -snapshot: []
  -owner: User {#7563 ▼
    #id: 3
    -firstName: "test"
    -favouriteArticles: PersistentCollection {#7796}
    #username: "[email protected]"
    #usernameCanonical: "[email protected]"
    #email: "[email protected]"
    #emailCanonical: "[email protected]"
    #enabled: true
    #salt: null
    #password: "$2y$13$.8Ky5Jj71PUsGD9E04nre./xClPVZ/Uiia40PTQjGmMAqOFpW2mwi"
    #plainPassword: null
    #lastLogin: DateTime {#7559 ▶}
    #confirmationToken: null
    #passwordRequestedAt: null
    #groups: null
    #roles: []
  }

Не могли бы вы опубликовать полный код для объекта User? Соблюдаете ли вы рекомендации Doctrine по использованию ArrayCollection, т.е. устанавливаете ли вы ArrayCollection в конструкторе пользователя? Кроме того, я не вижу опции cascade в вашей собственности $favouriteArticles. Вы уверены, что Doctrine записывает эти изменения при выполнении $em->persist($user)?

dbrumann 07.01.2019 11:33

@dbrumann Он обновлен

Филип Недялков 07.01.2019 11:35

Спасибо. Конструктор getFavouriteArticle и addFavouriteArticle выглядят нормально. setFavouriteArticles вызывает проблемы (вы заменяете ArrayCollection массивом), но давайте побеспокоимся об этом, когда мы исправим проблему. По-прежнему существует проблема с отсутствующим каскадом. Не могли бы вы попробовать @ORM\ManyToMany(targetEntity = "AppBundle\Entity\Article", cascade = {"all"}) (добавление каскада)?

dbrumann 07.01.2019 11:40
* @ORM\ManyToMany(targetEntity = "AppBundle\Entity\Article", cascade = {"all"}) Готово. Тот же результат.
Филип Недялков 07.01.2019 11:44

Работает ли сейчас обновление пользователя (добавление любимой статьи), а затем поиск статей?

dbrumann 07.01.2019 11:46

Добавление любимых статей пользователя работает нормально, когда я вызываю этот метод public function addToFavourites($category, $id), но все равно показывает мне -favouriteArticles: PersistentCollection {#7796}

Филип Недялков 07.01.2019 11:48

PersistentCollection подходит, но сколько элементов в нем? PersistentCollection - это особый тип Collection, который Doctrine использует для внутренних целей. Обычно вам не нужно беспокоиться о типе класса. Вы также можете попробовать dump( $test->toArray()) вместо этого, чтобы получить фактический массив избранных статей.

dbrumann 07.01.2019 11:52
$test->toArray() работает идеально, он возвращает мои ровно 2 статьи с идентификаторами 8 и 9.
Филип Недялков 07.01.2019 11:53

Может быть, результат просто вводит в заблуждение? Вы получаете список любимых статей. Поскольку статьи ссылаются на пользователя (owner-property), этот владелец содержит ту же коллекцию # 7796, которая у вас уже есть в качестве свойства favouriteArticles.

dbrumann 07.01.2019 11:54

Как я могу проверить?

Филип Недялков 07.01.2019 11:56

Что ж, если он работает и без cascade, то, наверное, так оно и было. В будущем вы, возможно, захотите переместить ->toArray() внутрь получателя и убедиться, что вы всегда возвращаете массив вместо объекта коллекции.

dbrumann 07.01.2019 13:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
11
45
0

Другие вопросы по теме