【问题标题】:Laravel view won't loop model even though it is populated即使填充了 Laravel 视图,它也不会循环模型
【发布时间】:2017-04-25 15:13:29
【问题描述】:

我正在为我的 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),
            ]);
    }
}

还有几个简单的刀片

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-&gt;count() }} - but the@foreach ($emails as $email)`的域下输出正确数量的电子邮件不会循环。

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

使用 emails 变量时出现什么问题?

【问题讨论】:

    标签: laravel-5 eloquent laravel-blade


    【解决方案1】:

    你必须做一些小改动才能让它工作

     public function domain($name)
    {
        $domain = VirtualDomain::where('name', $name)->first();
    
        return view('domain', [
                'domain' => $domain,
                'emails' => VirtualUser::where('domain_id', $domain->id)->get(),
            ]);
    }  
    

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多