API - Embed object in collection? - mezzio-hal

Hi,

I try to develop a API Rest service with mezzio and have a problem.
I used https://github.com/ezimuel/zend-expressive-api from @enrico that i migrated to Mezzio for my base of structure and testing.

I have a Product model and a Stock model.

When i’m requesting for one product i would like a Stock model embedded. It works!
I got a product with a embed Stock object inside in my json. I proceeded like that:

   // Product model query
    $product = $this->productModel->getProduct($id);

    // Create product HAL from object
    $productHal = $this->resourceGenerator->fromObject($product, $request);

    // Stock model query
    $stock = $this->stockModel->getWithProductId($id);

    // Create stock HAL from object
    $stockHal = $this->resourceGenerator->fromObject($stock, $request);

    // Embed stock to product
    $productHal = $productHal->embed('stocks', [$stockHal]);

    return $this->responseFactory->createResponse($request, $productHal);

But how to do that in a collection?

I have something like that in my Product model but don’t kwow how to add embed Stock in a collection of Product, i know the process have to be done somewhere else…

public function getAll(): Paginator
{
    $select = new Select($this->table->getTable());

    $select->columns($this->fields)
            ->where->equalTo('isActive', 1); 

    $paginatorAdapter = new DbSelect(
        $select,
        $this->table->getAdapter(),
        $this->table->getResultSetPrototype()
    );

    $paginator = new ProductCollection($paginatorAdapter);
    return $paginator;
}

I read somewhere that i have to create a special hydrator for it… Is it right?

  class ProductHydrator extends ObjectPropertyHydrator
   {
    private $stockModel;

    public function __construct(StockModel $stockModel)
    {
        $this->stockModel = $stockModel;
    }

    public function hydrate(array $data, object $object)
    {
        $product = parent::hydrate($data, $object);

        if (null !== $product->id) {
            $stock = $this->stockModel->getWithProductId($product->id);
            $product->stocks = $stock;
        }

        return $product;
    }
 }

It works but i would like to know if it is the right way? Or it exist another way to manage that?

Thanks!

I did not get answer… someone can tell me please if i’m on the wight way with my problem (inject data in model from hydrator)? Thanks!

I might don’t have the answer for you, but I ran into a similar problem with Doctrine. The answer to that was a SQL JOIN.