Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 条令:如何选择附加到用户实体的存储_Php_Doctrine Orm_Zend Framework2 - Fatal编程技术网

Php 条令:如何选择附加到用户实体的存储

Php 条令:如何选择附加到用户实体的存储,php,doctrine-orm,zend-framework2,Php,Doctrine Orm,Zend Framework2,我在多对多关系数据库中有一个带有附加存储的用户实体。 我正在用以下内容加载控制器中的存储: $userrepository = $this->getEntityManager()->getRepository('Thuiswinkelen\Entity\User'); $user = $userrepository->findOneBy(array('id' => $this->getUserId())); $stores = $user->getS

我在多对多关系数据库中有一个带有附加存储的用户实体。 我正在用以下内容加载控制器中的存储:

$userrepository = $this->getEntityManager()->getRepository('Thuiswinkelen\Entity\User');
$user      = $userrepository->findOneBy(array('id' => $this->getUserId()));
$stores = $user->getStores();
这很好用

现在,我希望登录用户选择一个附加到他的商店,并向他显示该商店中的所有产品

我是这样想的:

$user->getStore($storeid)->getProducts();
这不起作用,因为我没有这样设置实体。 我也认为这是一种糟糕的做法(?)

第二种选择是这样

$storerepository = $this->getEntityManager()->getRepository('Thuiswinkelen\Entity\Store');
$store      = $storerepository->findOneBy(array('id' => $storeid));
但在这种情况下,每个人都可以从一个没有附加到他们的商店查看产品

如何做到这一点

我的实体如下所示:

$user->getStore($storeid)->getProducts();
Entity/User.php

        <?php

        namespace Application\Entity;

        use BjyAuthorize\Provider\Role\ProviderInterface;
        use Doctrine\Common\Collections\ArrayCollection;
        use Doctrine\Common\Collections\Collection;
        use Doctrine\ORM\Mapping as ORM;
        use ZfcUser\Entity\UserInterface;

        /**
         * An example of how to implement a role aware user entity.
         *
         * @ORM\Entity
         * @ORM\Table(name="users")
         * @ORM\Entity(repositoryClass="Application\Repositories\UserRepository")
         *
         * @author Tom Oram <tom@scl.co.uk>
         */
        class User implements UserInterface, ProviderInterface
        {
            /**
             * @var int
             * @ORM\Id
             * @ORM\Column(type="integer")
             * @ORM\GeneratedValue(strategy="AUTO")
             */
            protected $id;

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

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

            /**
             * @var string
             * @ORM\Column(type="string", length=50, nullable=true)
             */
            protected $displayName;

            /**
             * @var string
             * @ORM\Column(type="string", length=128)
             */
            protected $password;

            /**
             * @var int
             */
            protected $state;

            /**
             * @var \Doctrine\Common\Collections\Collection
             * @ORM\ManyToMany(targetEntity="Application\Entity\Role")
             * @ORM\JoinTable(name="user_role_linker",
             *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
             *      inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
             * )
             */
            protected $roles;

            /**
                 * @var \Doctrine\Common\Collections\Collection
                 * @ORM\ManyToMany(targetEntity="Application\Entity\Store")
                 * @ORM\JoinTable(name="user_store_linker",
                 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
                 *      inverseJoinColumns={@ORM\JoinColumn(name="store_id", referencedColumnName="id")}
                 * )
             */
            protected $stores;


            /**
             * Initialies the roles variable.
             */
            public function __construct()
            {
                $this->roles = new ArrayCollection();
                $this->stores = new ArrayCollection();
            }

            /**
             * Get id.
             *
             * @return int
             */
            public function getId()
            {
                return $this->id;
            }

            /**
             * Set id.
             *
             * @param int $id
             *
             * @return void
             */
            public function setId($id)
            {
                $this->id = (int) $id;
            }

            /**
             * Get username.
             *
             * @return string
             */
            public function getUsername()
            {
                return $this->username;
            }

            /**
             * Set username.
             *
             * @param string $username
             *
             * @return void
             */
            public function setUsername($username)
            {
                $this->username = $username;
            }

            /**
             * Get email.
             *
             * @return string
             */
            public function getEmail()
            {
                return $this->email;
            }

            /**
             * Set email.
             *
             * @param string $email
             *
             * @return void
             */
            public function setEmail($email)
            {
                $this->email = $email;
            }

            /**
             * Get displayName.
             *
             * @return string
             */
            public function getDisplayName()
            {
                return $this->displayName;
            }

            /**
             * Set displayName.
             *
             * @param string $displayName
             *
             * @return void
             */
            public function setDisplayName($displayName)
            {
                $this->displayName = $displayName;
            }

            /**
             * Get password.
             *
             * @return string
             */
            public function getPassword()
            {
                return $this->password;
            }

            /**
             * Set password.
             *
             * @param string $password
             *
             * @return void
             */
            public function setPassword($password)
            {
                $this->password = $password;
            }

            /**
             * Get state.
             *
             * @return int
             */
            public function getState()
            {
                return $this->state;
            }

            /**
             * Set state.
             *
             * @param int $state
             *
             * @return void
             */
            public function setState($state)
            {
                $this->state = $state;
            }

            /**
             * Get role.
             *
             * @return array
             */
            public function getRoles()
            {
                return $this->roles->getValues();
            }

            /**
             * Add a role to the user.
             *
             * @param Role $role
             *
             * @return void
             */
            public function addRole($role)
            {
                $this->roles[] = $role;
            }

            /**
             * Get store.
             *
             * @return array
             */
            public function getStores()
            {
                return $this->stores->getValues();
            }

            /**
             * Get store.
             *
             * @return array
             */
            public function getStore($id)
            {
                return $this->stores->getValues();
            }

            /**
             * Add a store to the user.
             *
             * @param Role $store
             *
             * @return void
             */
            public function addStore($store)
            {
                $this->stores[] = $store;
            }
        }

我认为,您的第二种方法更好。您应该使用存储库,或者更好的是,服务类(在内部处理存储库)来访问您的用户、商店等。在这种情况下,将分别为用户和商店提供两个独立的服务。然后,您执行以下操作:

$user = $userService->get($userId);
要获取用户,请执行以下操作:

$store = $storeService->get($storeId);
去你想要的商店

至于访问控制,您只需在任一服务中实现类似于hasStore(User$User,Store$Store)
的方法,并在需要时调用它即可

当然,一开始是否在应用程序中引入服务层是一个很大的问题,但通常认为这是一个很好的实践(在大多数情况下)。

在您的情况下,尝试一下

$userrepository = $this->getEntityManager()->getRepository('Thuiswinkelen\Entity\User');
$user      = $userrepository->findOneBy(array('id' => $this->getUserId()));
$stores = $user->getStores();

$product = array();
foreach ($stores as $store) {
    $product[] = $store->getProducts();
}
但是,我认为这是个坏主意:

我的想法-您需要另一张带有idStore idProduct约束的表

$userrepository = $this->getEntityManager()->getRepository('Thuiswinkelen\Entity\User');
$user      = $userrepository->findOneBy(array('id' => $this->getUserId()));
$stores = $user->getStores();

$product = array();
foreach ($stores as $store) {
    $product[] = $store->getProducts();
}
    /**
     * @var \Doctrine\Common\Collections\Collection
     * @ORM\ManyToMany(targetEntity="Application\Entity\Product" )
     * @ORM\JoinTable(name="product_store",
     *      joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="store_id", referencedColumnName="id")}
     * )
     */
    protected $products;