2015-11-29 3 views
0

У меня есть два объекта User и Items, пользовательский объект имеет массив идентификаторов элементов, хранящихся в $item_ids, теперь, когда я хочу, когда пользователь получает выбор, элементы также извлекаются и, например, хранится в $item_storage.Таблица перекрестных ссылок Symfony Doctrine с массивом идентификаторов

Возможно ли это с аннотациями, например OneToMany/ManyToOne/ManyToMany, или мне нужно создать собственный класс репозитория объектов для этого?

Очистить. В результате я хотел бы быть в состоянии сделать следующее

// ... 

/** 
* @Route("/show/", name="show") 
*/ 
public function showAction() 
{ 

    $user= $this->getDoctrine()->getManager() 
     ->getRepository('AppBundle\\Entity\\User') 
     ->findOneById(1); 

    return $this->render('show/multi_array.html.twig', array(
     'user' => $user->getName(), 
     'multi_array' => $user->getItemStorage(), // should return a array of Items 

    )); 

} 

// ... 

В $user->getItemStorage массив я хотел бы получить обратно выглядит что-то вроде этого

 
Array 
(
    [0] => Array 
     (
      [id] => 1 
      [name] => Item One 
      [more_cols] => more data 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [name] => Item Two 
      [more_cols] => more data 
     ) 

) 

записей базы данных будет выглядеть как

 
User Table 
| Id | Name | Item_ids      | 
| 1 | Me | a:2:{i:0;s:1:"1";i:1;s:1:"2";} | 

Items Table 
| Id | Name  | More_cols | 
| 1 | Item One | more data | 
| 2 | Item Two | more data | 

Пользовательское лицо

<?php 
// src/AppBundle/Entity/User.php 
namespace AppBundle\Entity; 

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

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

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

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

    /** 
    * @ORM\Column(type="array") 
    */ 
    protected $item_ids; 

    protected $item_storage; 

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


    // ... 
} 

пункт, Entity

<?php 
// src/AppBundle/Entity/Items.php 
namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="users") 
*/ 
class Items 
{ 

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

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

    /** 
    * @ORM\Column(type="string") 
    */ 
    protected $more_cols; 

    // ... 
} 
+0

Есть ли причина, по которой вы хотите хранить идентификаторы, является сериализованным массивом? Вы можете использовать ManyToMany и хранить соединения между Пользователями и Элементами в отдельной таблице. –

+0

@ivan Я думал, что @ORM \ Column (type = "array") сохранит его в сериализованном массиве. – Mazaka

ответ

2

Как @Ivan сказал, что вы можете использовать OneToMany и ManyToMany в зависимости от бизнес-логики. Например, я использовал связь OneToMany.

class User 
{ 

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

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255, unique=true) 
    */ 
    private $name; 


    /** 
    * @ORM\OneToMany(targetEntity="Items", mappedBy="user", cascade={"persist", "remove"}) 
    */ 
    private $items; 

    //Getters and setters 
} 

И субъект Items.

class Items 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

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

    /** 
    * @ORM\Column(type="string") 
    */ 
    protected $more_cols; 

    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="items") 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    */ 
    protected $user; 

    //Getters and setters 
} 

Вы можете получить детали Почитать так:

$user->getItems(); 

Но результат не будет массив массива, будет массив объектов.

forearch($user->getItems() as $item) 
{ 
    $item->getName(); 
    $item->getMoreTools(); 
}