通过定义的存储库查找实体字段

时间:2018-12-19 20:22:08

标签: symfony doctrine

我正在使用MVC和存储库模式开发一个symfony应用程序。 现在,我想要某些使用mysql并调用DatabaseRepository的实体以及其他从api收集并使用ApiRepository的实体。

现在,对于mysql实体,我使用默认的ORM,但对于api实体,我使用食尸鬼来收集其数据。

DatabaseRepository代码段:

/**
* @method Merchant|null find($id, $lockMode = null, $lockVersion = null)
* @method Merchant|null findOneBy(array $criteria, array $orderBy = null)
* @method Merchant[]    findAll()
* @method Merchant[]    findBy(array $criteria, array $orderBy = null,     $limit = null, $offset = null)
*/
class MerchantRepository extends ServiceEntityRepository
{
    public function __construct(RegistryInterface $registry)
    {
        parent::__construct($registry, Merchant::class);
    }
}

ApiRepository代码段:

 /**
 * Get a merchant by Id
 *
 * @param $transaction
 * @return Merchant
 */
public function find($id, $lockMode = null, $lockVersion = null) {
    if(strpos($id, Merchant::blockchainNameSpace()) !== false) {
        $id = explode("#", $id)[1];
    }

    // Specify API Call
    $url = $this->api_url . "Merchant/" . $id;

    $merchant = $this->client->get($url, [
        'query' => [
            'id' => $id,
            'filter' => '{"include": "resolve"}',
        ]
    ]);
    $merchant = $merchant->getBody()->getContents();
    $merchant = \GuzzleHttp\json_decode($merchant, true);

    $m = $this->convertToMerchant($merchant);

    return $m;
}

ConvertToMerchant:

 /*
 * Convert merchant array to marchant
 * @param array $merchant
 * return Merchant
 */
public function convertToMerchant(array $merchant) {
    $m = new Merchant();
    $m->setId($merchant['id']);
    $m->setName($merchant['name']);        $m->setUsers($this->userRepository()->findByMerchant($merchant['id']));
}

以上,我已经举例说明了我的商家。 现在,我使用mysql的用户与该商家有关系,我想获取该用户拥有的商家列表。

但是,每当我为用户存储库调用find方法时,它都会尝试查找mysql存储库中的所有关系,而不是该类定义的实体存储库。

用户类别:

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserDatabaseRepository")
 * @ORM\Table(name="user")
 */
 class User extends BaseUser implements EntityInterface, UserInterface
 {
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
     protected $id;

    /**
     * @var string
     *
     * @ORM\Column(type="string", nullable=true)
     */
    private $email;

    /**
     * @var Collection
     *
     * @ORM\ManyToMany(targetEntity="App\Entity\Merchant", inversedBy="users")
     */
     protected $merchants;
 }

商人阶层:

/**
 * @ORM\Entity(repositoryClass="App\Repository\MerchantApiRepository")
 * @ORM\HasLifecycleCallbacks()
 */
 class Merchant extends EntityBase
 {
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
     private $id;

    /**
     * @var string
     *
     * @ORM\Column(type="string")
     */
     private $name;

    /**
     * @var User[]
     *
     * @ORM\ManyToMany(targetEntity="App\Entity\User", mappedBy="merchants")
     */
     private $users;
 }

现在我期望的是,当我尝试找到用户时,它会从数据库(ID,电子邮件和所有商户ID)中检索用户,并从API存储库中检索商户,因为我指定了Merchant类调用MerchantApiRepository。

但是,相反,它从数据库中检索用户(标识,电子邮件和所有商户ID),并尝试从数据库中检索商户,并给出错误提示,因为它们不存在于数据库中。

我希望它使用商人实体中定义的存储库,但是它似乎使用用户实体中定义的存储库。

如何获取它的功能,以便在检索用户时使用我在Merchant实体中指定的存储库?

0 个答案:

没有答案