【问题标题】:Nested foreach loop to show the data嵌套 foreach 循环以显示数据
【发布时间】:2019-09-24 05:06:37
【问题描述】:

我有 5 个模型 PurchaseInventorySlabScartingFloorTile。我从Purchase 模型中获取集合,然后从该集合中我从Inventory 表中获取数据。然后根据该数据,我将进一步建模与Inventory 相关的Slab。现在,在从Slab 模型中获取数据后,我想使用Foreach 循环在刀片上展示它。但我收到错误:

为 foreach() 提供的参数无效

我已经在我的控制器中尝试过这个:

$slabs = Purchase::where('factoryName', $factoryName)->with('inventory.slab')->get();

本次查询结果如下:

{
    "id": 36,
    "marbleType_id": 2,
    "fname": "Sama",
    "lname": "Jojo",
    "factoryName": "Sama Inc.",
    "cnic": "3216542",
    "area": "Johar town",
    "city": "Lahore",
    "province": "Punjab",
    "phone1": "45678912345",
    "phone2": "45678912345",
    "inventory_ID": 10,
    "created_at": "2019-03-19 12:11:45",
    "updated_at": "2019-03-19 12:11:45",
        "inventory": {
        "id": 10,
        "purchase_id": 36,
        "marbleType": "1",
        "totalSquareFt": 25,
        "priceperSquareFt": 230,
        "totalPurchasePrice": 25000,
        "standardSize_ID": "5",
        "salePrice": 250,
        "miliMeter": "6mm",
        "slab_ID": 1,
        "scarting_ID": null,
        "floorTile_ID": null,
        "created_at": "2019-03-19 12:11:45",
        "updated_at": "2019-03-19 12:11:45",
            "slab": {
             "id": 1,
             "marbleName_ID": "2",
             "inventory_ID": "10",
             "created_at": "2019-03-19 12:11:45",
             "updated_at": "2019-03-19 12:11:45"
             }
        }
},
{
    "id": 55,
    "marbleType_id": 3,
    "fname": "Sama",
    "lname": "Jojo",
    "factoryName": "Sama Inc.",
    "cnic": "32165421",
    "area": "Johar town",
    "city": "Lahore",
    "province": "Punjab",
    "phone1": "45678912345",
    "phone2": "45678912345",
    "inventory_ID": 26,
    "created_at": "2019-04-25 10:47:41",
    "updated_at": "2019-04-25 10:47:41",
        "inventory": {
        "id": 26,
        "purchase_id": 55,
        "marbleType": "1",
        "totalSquareFt": 12,
        "priceperSquareFt": 12,
        "totalPurchasePrice": 120,
        "standardSize_ID": "1",
        "salePrice": 15,
        "miliMeter": "6mm",
        "slab_ID": 9,
        "scarting_ID": null,
        "floorTile_ID": null,
        "created_at": "2019-04-25 10:47:41",
        "updated_at": "2019-04-25 10:47:41",
            "slab": {
            "id": 9,
            "marbleName_ID": "3",
            "inventory_ID": "26",
            "created_at": "2019-04-25 10:47:41",
            "updated_at": "2019-04-25 10:47:41"
            }
        }
},
{
    "id": 56,
    "marbleType_id": 4,
    "fname": "Sama",
    "lname": "Jojo",
    "factoryName": "Sama Inc.",
    "cnic": null,
    "area": "Johar town",
    "city": "Lahore",
    "province": "Punjab",
    "phone1": "45678912345",
    "phone2": "45678912345",
    "inventory_ID": 27,
    "created_at": "2019-05-05 20:11:52",
    "updated_at": "2019-05-05 20:11:52",
        "inventory": {
        "id": 27,
        "purchase_id": 56,
        "marbleType": "3",
        "totalSquareFt": 20,
        "priceperSquareFt": 20,
        "totalPurchasePrice": 420,
        "standardSize_ID": "3",
        "salePrice": 25,
        "miliMeter": "6mm",
        "slab_ID": null,
        "scarting_ID": null,
        "floorTile_ID": 10,
        "created_at": "2019-05-05 20:11:52",
        "updated_at": "2019-05-05 20:11:52",
        "slab": null
        }
},
{
    "id": 57,
    "marbleType_id": 9,
    "fname": "Sama",
    "lname": "Jojo",
    "factoryName": "Sama Inc.",
    "cnic": null,
    "area": "Johar town",
    "city": "Lahore",
    "province": "Punjab",
    "phone1": "45678912345",
    "phone2": "45678912345",
    "inventory_ID": 28,
    "created_at": "2019-05-05 20:32:41",
    "updated_at": "2019-05-05 20:32:41",
        "inventory": {
        "id": 28,
        "purchase_id": 57,
        "marbleType": "2",
        "totalSquareFt": 31,
        "priceperSquareFt": 12,
        "totalPurchasePrice": 400,
        "standardSize_ID": "1",
        "salePrice": 15,
        "miliMeter": "8mm",
        "slab_ID": null,
        "scarting_ID": 4,
        "floorTile_ID": null,
        "created_at": "2019-05-05 20:32:41",
        "updated_at": "2019-05-05 20:32:42",
        "slab": null
        }
},
{
    "id": 59,
    "marbleType_id": 12,
    "fname": "Sama",
    "lname": "Jojo",
    "factoryName": "Sama Inc.",
    "cnic": null,
    "area": "Johar town",
    "city": "Lahore",
    "province": "Punjab",
    "phone1": "12345678945",
    "phone2": "45678945645",
    "inventory_ID": 30,
    "created_at": "2019-05-06 10:14:35",
    "updated_at": "2019-05-06 10:14:35",
        "inventory": {
        "id": 30,
        "purchase_id": 59,
        "marbleType": "2",
        "totalSquareFt": 12,
        "priceperSquareFt": 12,
        "totalPurchasePrice": 122,
        "standardSize_ID": "1",
        "salePrice": 12,
        "miliMeter": "8mm",
        "slab_ID": null,
        "scarting_ID": 5,
        "floorTile_ID": null,
        "created_at": "2019-05-06 10:14:35",
        "updated_at": "2019-05-06 10:14:35",
        "slab": null
        }
}

这是控制器中的 Foreach 循环,用于获取仅与 Slab 相关的数据。

foreach ($slabs as $slab) {
   if ($slab->inventory->slab_ID != NULL) {
       $marble_id = $slab->inventory->slab->marbleName_ID;
       $slab->marble = MarbleType::where('id', $marble_id)->get();
   }
}

这里是刀片内容,我想在表格中显示Slab 的数据。

@foreach($slabs  as $slab)
    @foreach($slab->marble as $mar)
        <tr>
            @if($slab->inventory->marbleType == 1)
               <td> Slab </td>
            @endif
            <td>{{ $mar->marbleType }}</td>
            <td>{{ $slab->inventory->totalSquareFt }}</td>
            <td>{{ $slab->inventory->totalPurchasePrice }}</td>
            <td>{{ date('M j, Y h:ia' , strtotime( $slab->created_at )) }}</td>
        </tr>
    @endforeach    
@endforeach

这是我在刀片文件上遇到的错误: Invalid argument supplied for foreach()

谁能指出我做错了什么?

【问题讨论】:

  • $slab-&gt;marble$slabs 之一或两者都不可迭代

标签: laravel foreach


【解决方案1】:

您可能需要在您的$slab-&gt;inventory-&gt;slab_ID 支票上使用else 语句,否则,您将尝试循环null$slab-&gt;marble 将等同于null)。如果您使用了else { $slab-&gt;marble = []; },那么您就可以使用foreach 而无需担心代码。

foreach ($slabs as $slab) {
  if ($slab->inventory->slab_ID != NULL) {
    $marble_id = $slab->inventory->slab->marbleName_ID;
    $slab->marble = MarbleType::where('id', $marble_id)->get();
  } else {
    $slab->marble = [];
  }

  foreach($slab->marble AS $mar){
    ...
  }
}

旁注,此代码可能非常低效。每当您需要在循环中运行查询时,您都可能面临瓶颈。考虑在初始查询中使用关系并预先加载它。

另外请注意,如果$slab-&gt;inventorynull,则在使用$slab-&gt;inventory-&gt;slab_ID 时会遇到trying to get property of non-object 错误。

【讨论】:

  • 你已经在使用它了; -&gt;with('inventory.slab') 就是一个例子。如果您没有调用它,当您访问purchase-&gt;inventoryinventory-&gt;slab 时,它们将使用资源执行一个新查询。但是由于您确实使用了-&gt;with(),它已经被加载了,所以访问不会调用新的查询。
  • “代码可能非常低效”是怎么回事??事实上,我是 laravel 的新手,所以我对编码标准不太了解。如果您能正确指导我,我将不胜感激。提前致谢
  • 是的,不用担心。因此,在运行循环时,如果您在该循环中执行查询,它必须访问数据库n 次才能获取该数据。这可能非常低效,具体取决于该循环的大小。急切加载的作用是使初始查询更加占用资源,但可以防止您之后必须在循环中执行查询。它有点宽泛,你会及时发现的。
  • 我需要问你类似的问题,如果我不想在表中重复特定 $mar-&gt;marbleType,但我想添加该特定的属性值(即 totalSquareFttotalPurchasePricemarbleType 与旧的相同 Marble ...你能告诉我怎么做吗?
  • 如果您有新问题,请提出新问题。评论是为了澄清/补充信息,而不是完全新的问题。我也不太清楚你在问什么,所以最好用更多信息/实际示例打开一个新问题。
猜你喜欢
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 2015-07-17
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多