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;