如何在刀片模板的 foreach 循环中访问 laravel 集合?

Posted

技术标签:

【中文标题】如何在刀片模板的 foreach 循环中访问 laravel 集合?【英文标题】:How to access laravel collection in a foreach loop in blade template? 【发布时间】:2019-10-11 20:54:37 【问题描述】:

我想从表Users 和作者ids 从表Pages 中获取用户名详细信息。为此,我创建了一个foreach 循环并将数据添加到users 数组中。

这会获取数据,但其格式不正确,无法在刀片模板中使用。下面是代码:

$pages = \App\page::all();
    $users = array();
    foreach ($pages as $page) 
        $user = \App\user::where('id', $page->author)->get('name');
        $users[] = $user;
           
    dd($users);
    return view('admin.pages', compact('pages', 'users'));

我已经用dd($users) 方法转储了结果并得到了这个:

我在刀片模板中使用此代码进行检索,但在 $users[$loop->index]->get('name') 位置出现空白。

@foreach ($pages as $page)
            <tr>
              <th> $page->id </th>
              <th> $page->title </th>
              <th> $users[$loop->index]->get('name') </th>
              @if($page->status = 'ACTIVE')
              <th><span class="label label-success"> $page->status  </span></th>
              @elseif($page->status = 'DRAFT')
              <th><span class="label label-warning"> $page->status  </span></th>
              @endif
              <th> $page->Actions </th>
            </tr>
            @endforeach

【问题讨论】:

在 foreach 循环中设置关联数组 你能再解释一下吗 检查答案,我还解释了答案代码与您当前的代码有何不同 您不应编辑您的问题以表明它已解决。将答案标记为接受将向未来的访问者提供该信息。 是的,但@ImmortalDude 方法是正确的,但没有给我预期的结果,所以我这样做了。您的答案很完美,因此我将您的答案标记为已接受。 【参考方案1】:

你没有正确定义你的关系。 App\User 应该在模型中定义这个:

public function pages()

    // have to specify the key name is author, not user_id
    return $this->hasMany("App\Page", "author");

然后在App\Page 模型中,你有这个:

public function pageauthor()

    // have to specify the key name is author, not user_id
    return $this->belongsTo("App\User", "author");

然后在您的 Blade 模板中,您只需引用 $page-&gt;author-&gt;name

@foreach ($pages as $page)
            <tr>
              <th> $page->id </th>
              <th> $page->title </th>
              <th> $page->pageauthor->name </th>
...

【讨论】:

我会尝试使用关系。 关系是 Laravel 的基石,应用程序应该围绕它们进行规划。我可以通过您的数据库列名看出情况并非如此。 我收到此错误Trying to get property of non-object (View: H:\laravel\work\resources\views\admin\pages.blade.php) 我已经告诉过你应该怎么做,但我无法帮助你调试整个应用程序。做一些倾倒,做一些阅读。 laravel.com/docs/5.8/eloquent-relationships#one-to-many 很高兴为您提供帮助。如果你刚刚开始做这件事,你可以通过改造你的数据库来适应 Laravel 的约定,让你的生活变得更轻松。 laravel.com/docs/5.8/eloquent#eloquent-model-conventions【参考方案2】:

您可以在控制器中使用 foreach 循环来访问其属性。

喜欢这个

$users = \App\user::where('id', $page->author)->get('name');

$data = [];

foreach( $users as $user )
        $data['name'] = $user['name'];       
   

然后在刀片文件中传递 $data 数组并通过 $data['name']; 访问 name;

【讨论】:

但我们必须首先使用 pages 表中的作者 ID 循环 users 表。 我试过你的代码,但它说 $data 变量未在控制器中定义 你在刀片中传递了 $data 吗?像这样:return view('admin.pages', compact('pages', 'users', 'data')); 是的,通过但在此之前在控制器页面中出现错误首先说 $data 变量未定义。 我已经编辑了代码部分。请检查。定义 $data= [];在 foreach 之前【参考方案3】:

这样的东西应该可以帮助你

你的控制器

$pages = \App\page::all();
foreach ($pages as $page) 
    $user = \App\user::find($page->author)->pluck('name');
    if(isset($user))
      $page['user_name'] = $user->name;
     else 
       $page['user_name'] = 'N/A';
     

return view('admin.pages', compact('pages'));

你的看法

    @foreach ($pages as $page)
            <tr>
              <th> $page->id </th>
              <th> $page->title </th>
              <th> $page->user_name) </th>
              @if($page->status = 'ACTIVE')
              <th><span class="label label-success"> $page->status  
    </span></th>
              @elseif($page->status = 'DRAFT')
              <th><span class="label label-warning"> $page->status  
</span></th>
               @endif
              <th> $page->Actions </th>
            </tr>
            @endforeach

代码与您当前的代码有何不同

1) 它将用户名写入主集合本身 ($pages),从而让您不必担心只在视图中循环遍历一个集合

2) 它使用 laravel 的 find(),因为一个页面只能有作者(我假设)(注意:find() 基于您的主键工作,在这种情况下,它将通过 id 列进行搜索,这是最公共主键列)

3) 它使用pluck()

【讨论】:

得到这个错误Property [name] does not exist on this collection instance.。名称列肯定有用户表。 嗯,那么您的某些用户似乎找不到 每个页面都有一个作者,每个作者都有名字。检查 users 表 --> https://imgur.com/2OP5nYt 和 pages 表 --> https://imgur.com/v4YVzTY 如果您希望能够在循环中更改$pages,您需要通过引用传递它。你的循环现在什么都不做。 通过将$user = \App\User::find($page-&gt;author)-&gt;pluck('name'); 更改为$user = \App\User::where('id', $page-&gt;author)-&gt;get('name'); 并将$page['user_name'] = $user-&gt;name; 更改为$page['user_name'] = $user[0]-&gt;name; 解决了这个问题

以上是关于如何在刀片模板的 foreach 循环中访问 laravel 集合?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在 laravel php 刀片模板中为 foreach 循环定义循环变量

在每个 foreach 循环迭代中包含重复的刀片模板

刀片模板中的@php 标记无法访问内联变量

尝试在 foreach 循环中获取密钥以使用刀片工作

如何在刀片foreach循环中获取迭代次数

Laravel 刀片模板,URL::to 中的 foreach 变量?