0

我希望这比我一直在阅读的文档更简单。

我有许多与标准 FOSUserbundle 用户实体具有多对一关系的实体,可以登录用户、注册用户、注销等。

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

    public function __construct()
    {
        parent::__construct();
    }

我的每个用户也可以拥有许多宠物。即这里的猫实体(简化):

class Cat
{
    /**
     * @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)
     */
    private $name;

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

我应该如何添加一个访问控制列表用户角色,该角色定义用户是否有猫,如果有,则允许它们进入我网站的“仅限猫”部分。

注意(稍微相关):当谈到使用原则进行数据库设计时,我感觉有点迟钝,我会支持任何可以指出我的优秀教程/解释设计具有不同类型连接的东西的人,特别是如果它是在 Symfony/教义环境。

4

1 回答 1

0

好吧,因为你还没有得到任何东西。我会在那里扔一些东西,但到目前为止我的经验只是中等。

在您的猫主人页面的控制器中,您可以查询用户是否有任何关联的猫实体。

您需要将 OneToMany/ManyToOne 注释添加到您的用户和猫类,以及关联的变量。这你可以直接从 symfony2 书的教义部分复习(如果你正在使用 Symfony2 并且没有花时间阅读这本书,那是使用完整堆栈的最低知识水平,我建议你全部阅读)。(你真的需要一个只用于猫的实体类吗,你可以有一个带有“类型”选项的宠物实体。)

检查安全上下文以确保已登录,然后查询 db.

    $em = $this->getDoctrine()->getManager();

    $ownersCats = $em->getRepository('PetsPetSiteBundle:Blog')->findBy(array('type'=>'cat'));

或仅针对一个结果

    $ownersCats = $em->getRepository('PetsPetSiteBundle:Blog')->findOneBy(array('type'=>'cat'));

一旦你得到这个结果,如果它返回错误,你就知道他没有猫。否则继续。

显然,如果您不打算使用该页面上的实体或仅执行计数查询并查看它是否大于 0,则可以通过仅查询 id 或其他内容来使其性能更好?

于 2013-08-03T05:45:56.133 回答