【问题标题】:Undefined property in Laravel 5Laravel 5 中的未定义属性
【发布时间】:2017-07-29 16:15:39
【问题描述】:

我查看了其他回答了同样错误的问题,我知道我有一个无法定义的属性,但不确定如何定义它。第一次使用多对多关系,所以我假设这是问题所在。

Project Table id company stage status date_started date_finished timestamps

Employee Table id name department timestamps

Employee_Project Table id employee_id project_id

在这两个模型中,我都有 belongsToMany,对于 ProjectController 中的显示功能,我有:

$projects = Project::find($id);

在视图中,我想显示公司名称 ($projects->company) 以及该项目的员工及其各自部门。这些不起作用:

$projects->employees->name

$projects->employees->department

如何访问这些属性?

--更新-- 杰夫的回答有效,但我设置了一张像 <thead><th>PM</th><th>AM</th></thead>

<tbody><td>@if($employee->department == 'Project Manager'){{ $employee->name }}</td>

<td>@else($employee->department == 'Account Manager'){{ $employee->name }}</td></tbody>@endif

这并不能在各自的部分中显示正确的员工。任何想法如何解决这个问题?

【问题讨论】:

    标签: php mysql laravel eloquent many-to-many


    【解决方案1】:

    您的问题是$project->employees 是一个集合,而不是员工的单个实例。您需要遍历集合才能访问每个员工的姓名:

    foreach($project->employees as $employee) {
        echo $employee->name;
        echo $employee->department;
    }
    

    更新

    看起来您可能需要进行如下重组,我认为您可能希望整个 if 构造位于同一个表格单元格中,尽管我可能错了:

    <tbody>
        @foreach($project->employees as $employee)
        <tr>
            <td>
            @if($employee->department == 'Project Manager')
                {{ $employee->name }}
            @elseif($employee->department == 'Account Manager')
                {{ $employee->department }}
            @else
                <!-- What about non project/account managers? -->
            @endif
            </td>
        </tr>
        @endforeach
    </tbody>
    

    我可能完全错了,也许您希望客户经理和项目经理在不同的列中:

    <tr>
        <td>
        @if($employee->department == 'Project Manager')
            {{ $employee->name }}
        @endif
        </td>
        <td>
        @if($employee->department == 'Account Manager')
            {{ $employee->name }}
        @endif
        </td>
    </tr>
    

    请务必查看 Blade if 语句中的 documentation

    更新 2

    如果您想订购相关实体的返回方式,您可以执行以下操作(假设您希望员工按department 订购:

    $project->employees()->orderBy('department', 'DESC')->get();
    

    请注意,您不再访问 属性,您正在调用关系方法 employees(),以便您可以在查询执行之前对其进行修改。

    这是一个关于订购查询的documentation 的链接,上面还有另一个StackOverflow question

    【讨论】:

    • 嗨,杰夫,这确实有效,因为这些属性不再是未定义的。但是,我设置了一个类似 PM AM @if($employee->department == 'Project Manager'){ { $employee->name }} @else($employee->department == 'Account Manager'){{ $employee->department }} 确实如此无法在各自的部分显示正确的员工。任何想法如何解决这个问题?
    • @robk27 尝试将该更新添加到您的问题中,这有点难以确定我所看到的是正确的还是只是复制/粘贴错误。
    • 添加了更新。让我知道它看起来是否正常或希望我进一步编辑。
    • 对不起。更新了我的代码。我的代码中有@endif,我希望这两个部分都使用 $employee->name。它按照employee_project 表的顺序进行处理,而不是使用if 语句并检查$employee->department 以放入相应的名称。
    • 我不确定我是否理解。是一些员工被排除在外,或者他们的显示顺序错误,还是其他问题?
    【解决方案2】:

    所以我想出了如何在表格中显示正确的人以显示在各自部门的下方,我想分享一下。

    感谢@jeff-lambert,我添加了 foreach 循环,但我像在他的第一次更新中一样添加了整个行。这不起作用,因为员工没有出现在各自的部门。例如,客户经理出现在项目经理下方。为了解决这个问题,我必须为每个循环添加一个 foreach 循环。

    <td>
      @foreach($projects->employees as $employee)
      @if($employee->department == 'Project Manager')
       {{ $employee->name }}
      @endif
      @endforeach
     </td>
    

    希望这有助于解释它。

    【讨论】:

      猜你喜欢
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多