如何在刀片模板的 foreach 循环中访问 laravel 集合?
Posted
技术标签:
【中文标题】如何在刀片模板的 foreach 循环中访问 laravel 集合?【英文标题】:How to access laravel collection in a foreach loop in blade template? 【发布时间】:2019-10-11 20:54:37 【问题描述】:我想从表Users
和作者id
s 从表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->author->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->author)->pluck('name');
更改为$user = \App\User::where('id', $page->author)->get('name');
并将$page['user_name'] = $user->name;
更改为$page['user_name'] = $user[0]->name;
解决了这个问题以上是关于如何在刀片模板的 foreach 循环中访问 laravel 集合?的主要内容,如果未能解决你的问题,请参考以下文章