2015-11-29 63 views
0

我有兩個實體UserItems用戶實體有一個存儲在$item_ids中的項目id的數組,現在我想要的是當用戶被提取時,項目也被提取並且例如存儲在$item_storage帶有ID數組的Symfony Doctrine交叉引用表

這是可能的註釋類似OneToMany/ManyToOne/ManyToMany還是我需要做一個自定義的Entity Repository類來做到這一點?

要清除。 作爲結果,我希望能夠做到以下

// ... 

/** 
* @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; 
    } 


    // ... 
} 

Item實體

<?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

是否有一些原因,你想存儲ids是序列化數組?您可以使用ManyToMany並將用戶和項目之間的連接存儲在單獨的表中。 –

+0

@ivan我以爲@ORM \ Column(type =「array」)會將它保存在一個序列化數組中。 – Mazaka

回答

2

正如@Ivan說,你可以使用OneToManyManyToMany取決於你的業務邏輯。比如我用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`s項目是這樣的:

$user->getItems(); 

但結果不會是數組的數組,將對象的數組。

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