我有两个实体User
和Items
用户实体在$item_ids
中存储了一个项目ID数组现在我想要的是当获取用户时还提取项目并且例如存储在$item_storage
中。
是否可以使用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;
}
// ...
}
物品实体
<?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 :(得分:2)
正如@Ivan所说,根据您的业务逻辑,您可以使用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();
}
但是结果将不是数组的数组,将是对象数组。
foreach($array1 as $key => $value){
echo $array1[$key].PHP_EOL; //or $value
echo $array2[$key].PHP_EOL; //PHP_EOL just print a newline character
}