Найти поля сущностей по их определенному хранилищу - PullRequest
0 голосов
/ 19 декабря 2018

Я работаю над приложением Symfony, использующим MVC и шаблон репозитория.Теперь я хочу иметь определенные сущности, которые используют mysql, и вызывать DatabaseRepository и другие сущности, которые собраны из API, и использовать ApiRepository.

Теперь для сущностей mysql я использую ORM по умолчанию, но для сущностей api я использовал жретчтобы собрать их данные.

Фрагмент базы данных репозитория:

/**
* @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, связан с Merchant, и я хочу получить список Merchants, который есть у этого пользователя.

Однако всякий раз, когда я вызываю метод 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;
 }

Теперь я ожидаю, чтокогда я пытаюсь найти пользователя, он извлекает пользователя из базы данных (идентификатор, адрес электронной почты и все идентификаторы продавцов) и извлекает продавцов из хранилища API, поскольку я указал класс Merchant для вызова MerchantApiRepository.

Однако вместо этого он извлекает пользователя из базы данных (идентификатор, адрес электронной почты и все торговые идентификаторы) и пытается извлечь продавцов из базы данных, выдавая ошибку, поскольку они не существуют в базе данных.

I 'я ожидал, что он будет использовать репозиторий, определенный в Торговой Сущности, однако, похоже, что он использует репозиторий, определенный ПользователемEntity.

Как я могу заставить его функционировать так, чтобы он использовал хранилище, указанное в сущности Merchant при получении пользователя?

...