Ну, я создаю отношение 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: []
}
@dbrumann Он обновлен
Спасибо. Конструктор getFavouriteArticle и addFavouriteArticle выглядят нормально. setFavouriteArticles вызывает проблемы (вы заменяете ArrayCollection массивом), но давайте побеспокоимся об этом, когда мы исправим проблему. По-прежнему существует проблема с отсутствующим каскадом. Не могли бы вы попробовать @ORM\ManyToMany(targetEntity = "AppBundle\Entity\Article", cascade = {"all"}) (добавление каскада)?
* @ORM\ManyToMany(targetEntity = "AppBundle\Entity\Article", cascade = {"all"}) Готово. Тот же результат.
Работает ли сейчас обновление пользователя (добавление любимой статьи), а затем поиск статей?
Добавление любимых статей пользователя работает нормально, когда я вызываю этот метод public function addToFavourites($category, $id), но все равно показывает мне -favouriteArticles: PersistentCollection {#7796}
PersistentCollection подходит, но сколько элементов в нем? PersistentCollection - это особый тип Collection, который Doctrine использует для внутренних целей. Обычно вам не нужно беспокоиться о типе класса. Вы также можете попробовать dump( $test->toArray()) вместо этого, чтобы получить фактический массив избранных статей.
$test->toArray() работает идеально, он возвращает мои ровно 2 статьи с идентификаторами 8 и 9.
Может быть, результат просто вводит в заблуждение? Вы получаете список любимых статей. Поскольку статьи ссылаются на пользователя (owner-property), этот владелец содержит ту же коллекцию # 7796, которая у вас уже есть в качестве свойства favouriteArticles.
Как я могу проверить?
Что ж, если он работает и без cascade, то, наверное, так оно и было. В будущем вы, возможно, захотите переместить ->toArray() внутрь получателя и убедиться, что вы всегда возвращаете массив вместо объекта коллекции.






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