如何使 Phalcon ODM 将模型属性解析为 objects 而不是数组?
How to make Phalcon ODM parse model properies as objects but not arrays?
假设我们有 Collection class Product
。产品有多个附加变体。假设每个变体都有 name 和 price.
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 解析并使其将某些属性解析为 objects(或 objects 的数组)?
你是怎么处理这种情况的?
我在 ODM 模型上有一个 'beforeSave',它将我的 'ProductVariants' 转换为数组,在模型上插入 ProductVariant::class 名称。
然后我使用 afterFetch
和 afterSave
将数组转换回 'ProductVariants',使用的工厂或制造商的名称由 class 名称组成。
伪代码示例:
beforeSave:
$currentProduct = $productVariant->toArray();
$currentProduct['class'] = get_class($productVariant);
afterFetch
$builderName = $currentProduct->class.'Builder';
$builder = new $builderName();
$productVariant = $builder->create($currentProduct);
afterSave = afterFetch
假设我们有 Collection class Product
。产品有多个附加变体。假设每个变体都有 name 和 price.
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 解析并使其将某些属性解析为 objects(或 objects 的数组)?
你是怎么处理这种情况的?
我在 ODM 模型上有一个 'beforeSave',它将我的 'ProductVariants' 转换为数组,在模型上插入 ProductVariant::class 名称。
然后我使用 afterFetch
和 afterSave
将数组转换回 'ProductVariants',使用的工厂或制造商的名称由 class 名称组成。
伪代码示例:
beforeSave:
$currentProduct = $productVariant->toArray();
$currentProduct['class'] = get_class($productVariant);
afterFetch
$builderName = $currentProduct->class.'Builder';
$builder = new $builderName();
$productVariant = $builder->create($currentProduct);
afterSave = afterFetch