我的网站上有静态和动态产品。静态产品是从数据库加载的基本产品。动态产品是用户动态生成的(来自"设计自己的戒指"等应用程序)。
当进行购买时,对于售出的每种产品,都有一个名为购买的表/模型条目,购买模型保存售出产品的销售价格、数量等。购买模型hasOne产品。
这适用于静态产品。然而,动态产品需要将其数据保存在某个地方。我不想把动态产品保存到产品表中,因为除了购买之外,我不希望它们出现在其他地方。此外,它们还可以包含静态产品所没有的额外值。
然而,当我加载动态产品数据时,我希望它的结构像常规产品一样,所以我不必编写不同的逻辑来处理静态和动态产品。
我想出了创建一个名为mavs(模型属性值)的模型/表的想法,它的表结构如下:
id purchase_id model attribute value
1 3 Product name foo
2 3 Product description bar
3 3 Other size 7
我会将购买设置为有许多mav。它加载这些数据的默认方式是这样的:
[Purchase] => Array
(
[0] => Array
(
...
[Product] => Array
(
)
[Mav] => Array
(
[0] => Array
(
[id] => 1
[purchase_id] => 78
[model] => Product
[attribute] => name
[value] => foo
)
[1] => Array
(
[id] => 2
[purchase_id] => 78
[model] => Product
[attribute] => description
[value] => bar
)
[2] => Array
(
[id] => 3
[purchase_id] => 78
[model] => Other
[attribute] => size
[value] => 7
)
)
)
)
我想把它构造成这样:
[Purchase] => Array
(
[0] => Array
(
...
[Product] => Array
(
[name] => foo,
[description] => bar
)
[Other] => Array
(
[size] => 7
)
)
)
这样它就可以像普通产品一样被加工。
我想我可以通过在Mav模型中的afterFind回调中更改数据来实现这一点。我创建了这个功能:
public function afterFind( $results, $primary )
{
debug($results);
foreach($results as $key => $data)
{
$model = $data['Mav']['model'];
$attribute = $data['Mav']['attribute'];
$value = $data['Mav']['value'];
$results[$key] = array( $model => array( $attribute => $value ) );
}
debug($results);
return $results;
}
我正在调试更改前后的数据:
Array
(
[0] => Array
(
[Mav] => Array
(
[id] => 1
[purchase_id] => 78
[model] => Product
[attribute] => name
[value] => foo
)
)
)
对此:
Array
(
[0] => Array
(
[Product] => Array
(
[name] => foo
)
)
)
这正是我想要的。然而,我从$purchase->find()
中获得的数据仍然是以原始方式构建的。我不知道为什么它没有反映我在afterFind回调中所做的更改。
那么我该如何做到这一点呢?此外,如果有人能一起为我的问题提供更好的解决方案,我们也欢迎。
您使用$results两次。
使用您喜欢的数据结构创建一个新数组,并返回新数组。
我重写了您的函数,以执行实际的意图。在这里看到它的工作:http://codepad.org/8ajWNai8
function afterFind( $results, $primary )
{
foreach($results as &$currentResult)
{
foreach($currentResult["Mav"] as &$mavDetails)
{
$model = $mavDetails['model'];
$attribute = $mavDetails['attribute'];
$value = $mavDetails['value'];
if (!array_key_exists($model, $currentResult))
{
$currentResult[$model] = array();
}
$currentResult[$model][$attribute] = $value;
}
unset($currentResult["Mav"]);
}
return $results;
}
由于到目前为止,我对CakePHP的接触为零,这在上下文中可能是微妙的错误。然而,函数本身似乎恰好创建了您在问题中描述的内容。