Laravel 视图不会循环模型,即使它已填充

Laravel view won't loop model even though it is populated

我正在为我的 dovecot 数据库创建一个基于 Web 的界面。

我可以很容易地获得数据库中所有虚拟域的列表以及电子邮件和别名的数量。

但是当我尝试加载一个页面以列出特定域下的电子邮件时,它变得很奇怪。

三个简单模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class VirtualDomain extends Model
{
    public function emails()
    {
        return $this->hasMany('App\VirtualUser', 'domain_id');
    }

    public function aliases()
    {
        return $this->hasMany('App\VirtualAlias', 'domain_id');
    }
}

class VirtualUser extends Model
{
    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
    ];
}

class VirtualAlias extends Model
{
    //
}

我的默认控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\VirtualDomain;
use App\VirtualUser;

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('home', [
                'domains' => VirtualDomain::all(),
            ]);
    }



    public function domain($name)
    {
        $domain = VirtualDomain::where('name', $name)->first();

        return view('domain', [
                'domain' => $domain,
                'emails' => VirtualUser::where('domain_id', $domain->id),
            ]);
    }
}

和几个简单的 blades

home.blade.php

<p>
    {{ $domains->count() }} domains
</p>

<table class="table-summary">
    <thead>
        <tr>
            <th>name</th>
            <th>emails</th>
            <th>aliases</th>
            <th class="table-summary-options">options</th>
        </tr>
    </thead>

    <tbody>
        @foreach ($domains as $domain)
            <tr>
                <td><a title="view emails for this domain" href="domain/{{ $domain->name }}">{{ $domain->name }}</a></td>
                <td>{{ $domain->emails->count() }}</td>
                <td>{{ $domain->aliases->count() }}</td>
                <td class="table-summary-options"><a class="ui-action" title="remove this domain" href=""><img src="/img/ui/remove.png" alt="remove"></a></td>
            </tr>
        @endforeach
    </tbody>
</table>

和domain.blade.php

<p>
    <a href="/">&lt;&lt;</a> - {{ $domain->name }} - {{ $emails->count() }} emails
</p>

<table class="table-summary">
    <thead>
        <tr>
            <th>email</th>
            <th class="table-summary-options">options</th>
        </tr>
    </thead>

    <tbody>
        @foreach ($emails as $email)
            <tr>
                <td><a title="view aliases for this domain" href="email/{{ $email->email }}">{{ $email->email }}</a></td>
                <td class="table-summary-options"><a class="ui-action" title="remove this email" href=""><img src="/img/ui/remove.png" alt="remove"></a></td>
            </tr>
        @endforeach
    </tbody>
</table>

视图在 {{ $emails->count() }} - but the@foreach ($emails as $email) 不循环的域下输出正确数量的电子邮件。

当我修改 blade 以简单地使用来自域变量({{ $domain->emails->count() }}@foreach ($domain->emails as $email))的电子邮件时,我得到了正确的计数并且正确填充了列表。

使用电子邮件变量时出现什么问题?

您必须稍作改动才能正常工作

 public function domain($name)
{
    $domain = VirtualDomain::where('name', $name)->first();

    return view('domain', [
            'domain' => $domain,
            'emails' => VirtualUser::where('domain_id', $domain->id)->get(),
        ]);
}  

如果没有 ->get(),您将获得一个查询构建器实例,而如果使用 get(),您将获得一个集合 return。在 foreach 循环中,可以迭代集合,而不能迭代查询构建器实例。

希望对您有所帮助