如何解决在Laravel中尝试获取非对象的属性?

时间:2016-10-20 07:58:30

标签: php html mysql css laravel

我有一个带有外键的主表Tickets到另一个名为ticket_statuses的表。我想根据外键从ticket_statuses显示状态字段。

TicketsController.php

<?php

namespace App\Http\Controllers\Users;

use App\Http\Requests;
use App\Http\Controllers\Controller;

use App\Ticket;
use App\TicketStatus;
use App\Models\User;
etc...

class TicketsController extends UserController
{

public function index()
{
    $tickets = Ticket::paginate(25);

    return view('user.tickets.index', compact('tickets'));
}

}

Ticket.php

class Ticket extends Model
{

    // Ticket __belongs_to__ User
    public function user()
    {
        return $this->belongsTo('App\Models\User');
    }

    public function ticketstatus()
    {
        return $this->belongsTo('App\TicketStatus');
    }



}

TicketStatus.php

class TicketStatus extends Model
{
    // Ticket Status __has_many__ Ticket
    public function tickets()
    {
        return $this->hasMany('Ticket');
    }

}

index.blade.php

@foreach($tickets as $item)
    <tr>
        <td>{{ $item->ticket_statuses->status }}</td>
        <td>{{ $item->customer }}</td>
        <td>{{ $item->user->first_name }} {{ $item->user->last_name }}</td>
        <td>

            {!! Form::close() !!}
        </td>
    </tr>
@endforeach

由于行{{$ item-&gt; ticket_statuses-&gt; status}},我收到错误。我也试过{{$ item-&gt; ticketstatus-&gt; status}}错误是试图获取非对象的属性

请帮忙。感谢

3 个答案:

答案 0 :(得分:1)

如果您的$item可能没有ticket_statuses,您可能需要在显示之前进行检查。

<td>{{ isset($item->ticketstatus) ? $item->ticket_statuses->status  : '' }}</td>

或使用Laravel Blade速记

<td>{{ $item->ticketstatus->status or "default message" }}</td>

答案 1 :(得分:1)

您在Ticket模型中的关系名称是ticketstatus,并且您正在尝试使用ticket_statuses获取数据,这是完全错误的,尝试使用您的关系名称,如下所示

$item->ticketstatus->status

答案 2 :(得分:1)

正如您在评论中提到的,请更改

public function ticketstatus()
{
   return $this->belongsTo('App\TicketStatus');
}

public function ticketstatus()
{
   return $this->belongsTo('App\TicketStatus', '_ticket_status_id', 'id');
}

然后再次使用{{ $item->ticketstatus->status }}。根据关系,当您使用ticket_status_id

时,laravel正在tickets表格中查找_ticket_status_id

如果有帮助,请告诉我们。