对于网店我试图生成一个看起来像这样的表:
Tablename: category 1
productname S M L X total
name1 1 0 1 3 5
name2 0 1 0 2 3
Tablename: category 2
productname S L X total
name5 1 1 3 5
name8 0 0 2 2
每个类别都有一个表格,每个类别都有自己的大小(例如,表格2没有大小M)。 表格显示了每个类别中每种产品每种尺寸的订购产品数量。
在应用程序中有一个模型 OrderProducts ,它们是每个订单中的订购产品。
OrderProduct 有一个 ProductSize ,它是产品尺寸的联结表
ProductSize 的尺寸(包含尺寸名称)
我要做的第一步是获得每个类别的所有尺寸/产品,如:
$order = Order::findOrFail($id);
$products = OrderProduct::where('orders_id',$id)->get();
$categories = Category::all();
//get sizes and products per category
foreach($categories as $cat)
{
$cat->thesizes= array();
$cat->theprodcts= array();
foreach($products as $product)
{
if($product->productSize->product->category_id == $cat->id)
{
array_push($cat->thesizes,$product->productSize);
array_push($cat->theprodcts,$product);
}
}
//make sure all values are unique (no dubbele sizes).
$cat->theSizes = array_unique($cat->theSizes);
$cat->theProducts = array_unique($cat->theProducts);
}
当我运行我的代码时,我收到以下错误:
间接修改重载属性App \ Category :: $ thesizes 没有效果
为什么我会收到此错误,我该如何解决?
答案 0 :(得分:13)
这是因为您的Category
班级已实施__get()
和__set()
magic methods。
因此,第7行($cat->thesizes= array();
)调用Category::__set()
,第12行(array_push($cat->thesizes,$product->productSize);
)调用Category::__get()
但不调用 Category::__set()
。因此,虽然您想要将值推送到您在类别上设置的数组,但由于array_push()
正在处理返回值而不是存储在类别中的实际数组,因此它无法工作。
有几种方法可以解决这个问题。最简单的方法是更改Category::__get()
以通过引用返回值,这是通过对函数的返回声明使用排序类型提示来完成的
class Category
{
public function &__get($key) {
// body of function
}
}
但是如果你有点好奇的话,可能不会推荐这个。
更明智的方法,至少在没有显着修改代码的情况下,是在循环范围内构建数组,然后将它们添加到Category
个对象
foreach ($categories as $cat) {
// Scope local arrays here first
$thesizes = array();
$theproducts = array();
foreach ($products as $product) {
if ($product->productSize->product->category_id == $cat->id) {
// Push to those local arrays
array_push($thesizes, $product->productSize);
array_push($theprodcts, $product);
}
}
// Now assign them to the category object
$cat->theSizes = array_unique($thesizes);
$cat->theProducts = array_unique($theproducts);
}
如果你想获得奖励积分,因为这是Laravel,你的回报值是collections,你可以做一些类似的事情来实现更复杂的实施
$categories = (Category::all())->map(function(Category $cat) {
$cat->theProducts = $products
->filter(function(Product $product) use ($cat) {
return $product->productSize->product->category_id == $cat->id;
})
->unique();
$cat->theSizes = $cat->theProducts
->map(function(Product $product) {
return $product->productSize();
})->unique();
});
答案 1 :(得分:0)
以下技巧对我有用
public function methods(){
//other logics
...
$result = json_decode(json_encode($result));
$result->someProp = (object)[];
$result->someProp->another = 'test';
return response()->json($result);
}
答案 2 :(得分:0)
发生错误的原因是,当您将array_push到类别对象的对象时,尽管该字段可能是一个数组,但是它位于一个对象中,您必须将字段保存到数组变量,然后将array_push保存到该变量,然后然后以json字符串的形式返回字段