具有id数组的Symfony Doctrine交叉引用表

时间:2015-11-29 16:21:07

标签: php symfony doctrine-orm doctrine symfony-2.7

我有两个实体UserItems用户实体在$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;

    // ...
}

1 个答案:

答案 0 :(得分:2)

正如@Ivan所说,根据您的业务逻辑,您可以使用ManyToManyOneToMany。例如,我使用了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



}