Symfony / доктрина: о двунаправленном отношении «многие ко многим». Я не могу получить связанные объекты - PullRequest
0 голосов
/ 27 декабря 2011

У меня есть отношение многие ко многим и действие:

<?php

namespace Acme\HelloBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\Table(name="article")
 */
class Article
{

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

  /**
   * @ORM\Column(type="string", length=100)
   */
  protected $name;

  /**
   * @ORM\ManyToMany(targetEntity="User", inversedBy="articles")
  */  
  protected $users;  

    public function __construct()
    {
        $this->users = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }


    /**
     * Add users
     *
     * @param Acme\HelloBundle\Entity\User $users
     */
    public function addUser(\Acme\HelloBundle\Entity\User $users)
    {        
        //$users->addArticle($this); // synchronously updating inverse side
        $this->users[] = $users;
    }

    /**
     * Get users
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getUsers()
    {
        return $this->users;
    }
}

<?php

namespace Acme\HelloBundle\Entity;

//  use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 */
class User
{

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

  /**
   * @ORM\Column(type="string", length=100)
   */
  protected $name;

  /**
  * @ORM\ManyToMany(targetEntity="Article", mappedBy="users")
  */
  protected $articles;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }
    public function __construct()
    {
        $this->articles = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add articles
     *
     * @param Acme\HelloBundle\Entity\article $articles
     */
    public function addArticle(\Acme\HelloBundle\Entity\article $articles)
    {
        $this->articles[] = $articles;
    }

    /**
     * Get articles
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getArticles()
    {
        return $this->articles;
    }
}


/////////////////////////////////

    public function indexAction($name)
    {

        $article = $this->getDoctrine()->getRepository('AcmeHelloBundle:Article')->findOneBy(array());


        $users = $article->getUsers();

        var_dump($users);

    }

Затем я загрузил некоторые приборы.Наконец, я вызываю действие и получаю следующий вывод:

object(Doctrine\ORM\PersistentCollection)#109 (9) {
  ["snapshot":"Doctrine\ORM\PersistentCollection":private]=>
  array(0) {
  }
  ["owner":"Doctrine\ORM\PersistentCollection":private]=>
  object(Acme\HelloBundle\Entity\Article)#103 (3) {
    ["id":protected]=>
    int(1)
    ["name":protected]=>
    string(19) "Creditos para todos"
    ["users":protected]=>
    *RECURSION*
  }
  ["association":"Doctrine\ORM\PersistentCollection":private]=>
  array(15) {
    ["fieldName"]=>
    string(5) "users"
    ["joinTable"]=>
    array(0) {
    }
    ["targetEntity"]=>
    string(28) "Acme\HelloBundle\Entity\User"
    ["mappedBy"]=>
    string(8) "articles"
    ["inversedBy"]=>
    NULL
    ["cascade"]=>
    array(0) {
    }
    ["fetch"]=>
    int(2)
    ["type"]=>
    int(8)
    ["isOwningSide"]=>
    bool(false)
    ["sourceEntity"]=>
    string(31) "Acme\HelloBundle\Entity\Article"
    ["isCascadeRemove"]=>
    bool(false)
    ["isCascadePersist"]=>
    bool(false)
    ["isCascadeRefresh"]=>
    bool(false)
    ["isCascadeMerge"]=>
    bool(false)
    ["isCascadeDetach"]=>
    bool(false)
  }
  ["em":"Doctrine\ORM\PersistentCollection":private]=>
  object(Doctrine\ORM\EntityManager)#77 (10) {

Я ожидал, что вместо него появится объект User.

Ответы [ 2 ]

2 голосов
/ 27 декабря 2011

Вы получаете коллекцию пользователей, поскольку это ассоциация ToMany.

Просто переберите коллекцию:

<?php
// ...
$users = $article->getUsers();
foreach($users as $u){
    var_dump($u);
}
0 голосов
/ 28 мая 2016

Также вы можете получить массив значений из объекта методом:

$users = $article->getUsers()->getValues();
...