是什么引发“试图获取非对象的属性”错误

时间:2019-02-14 14:12:27

标签: php laravel laravel-blade dompdf laravel-exceptions

自从我开始第一个Laravel项目以来,我一直遇到错误 Trying to get property 'column_name' of non-object不间断,而且大多数时候我都能够以一种或另一种方式修复它,但是问题是,我不知道为什么会得到错误,或者如何预防该错误。例如,

// In my controller I have this domPDF function...
public function pdfgen(Request $request, $id) {
        $data = Table::find($id);
        View()->share('data', $data);

        if ($request -> has('download')) {
            $pdf = PDF::loadView('pdf/pdfgen');
            return $pdf ->download('pdfgen.pdf');
        }

        return view('pdf/pdfgen');
}
// In my blade file I have a table calling this column...
<td>{{ $data->column }}</td>

// and this link making the request in the pdfgen function... 
<a class="btn btn-primary" href="{{ route('pdfgen', ['download'=>'pdf']) }}">Download PDF</a>
// And in my routes of web.php...
Route::get('/pdfgen/{id}', array('as' => 'pdfgen', 'uses' => 'PDFController@pdfgen'));

,每当我按下该下载链接时,我就会获得带有trying to get property 'column' of non-object (View: /usr/src/workapp/resources/views/pdf/pdfgen.blade.php)的Whoops页面。为什么会出现此错误,而不是打开/保存对话框?

编辑:忘记添加,在尝试使用$ id获取特定数据之前,我调用了整个表($data = Table::all();),并在刀片视图中使用了@foreach将其打印在表中< / p>

编辑2:添加模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Table extends Model
{
    protected $table = 'table';
    protected $primaryKey = 'id';
    public $incrementing = false;

    protected $fillable = [
        // all columns are strings, even id
        'id',
        'column',
        'column2',
        'column3',
    ];

    public function table2()
    {
        return $this->hasMany('App\Table2');
    }
}

2 个答案:

答案 0 :(得分:2)

当您执行find($id)并且不存在记录时,它将返回null。因此,如果您尝试访问任何属性->column,它将引发错误。

您可以执行findOrFail($id) ,或者使条件if (is_null($data)) 在前端具有$data->column ?? 'defaultvalue '

现在,第二种情况是您的模型存在,但仍然出现错误,请执行以下操作:

$data = Table::find($id);
dd(array_keys($data->toArray()));

如果出现column,您应该会看到它。

最后,如果在上一步中不存在,但在表中,则检查模型的protected $hidden = []设置,该设置实际上隐藏了某些列。

答案 1 :(得分:0)

发生这种情况是因为您的$data可能是null,并且给定的$id记录也可能不存在于数据库中。

尝试如下更改代码:

Table::findOrFail($id);

从现在开始,如果您的具有给定ID的表不存在,它将自动返回404页。