Допустим, у нас есть класс коллекции Product
, Продукты имеют несколько дополнительных вариантов. Допустим, каждый вариант имеет название а также цена.
class ProductVariant
{
public $name;
public $price;
}
/*
* @property string $name
* @property ProductVariant[] $variants
*/
class Product extends \Phalcon\Mvc\Collection
{
}
Затем мы создаем продукт и сохраняем его:
$variant1 = new ProductVariant();
$variant2 = new ProductVariant();
$variant1->name = '...';
$variant2->name = '...';$product = new Product();
$product->name = '...';
$product->variants = array($variant1, $variant2);
$product->save();
Модель сериализуется и сохраняется в MongoDB, информация о ProductVariant
, И, конечно, когда мы получаем этот продукт из базы данных, мы получаем массив массивов вместо массива ProductVariant
,
Есть ли простой способ, как мы можем переопределить разбор Phalcon ODM и заставить его анализировать некоторые свойства как объекты (или массив объектов)?
Как ты делаешь такой случай?
У меня есть «beforeSave» в модели ODM, которая преобразует мои «ProductVariants» в массивы, вставляя в модель имя класса ProductVariant ::.
Тогда я использую afterFetch
а также afterSave
преобразовать массивы обратно в «ProductVariants», используя фабрику или конструктор, имя которого составлено с использованием имени класса.
Пример с псевдо-кодом:
beforeSave:
$currentProduct = $productVariant->toArray();
$currentProduct['class'] = get_class($productVariant);afterFetch
$builderName = $currentProduct->class.'Builder';
$builder = new $builderName();
$productVariant = $builder->create($currentProduct);afterSave = afterFetch
Других решений пока нет …