【问题标题】:What triggers the "Trying to get property of non-object" error什么触发了“尝试获取非对象的属性”错误
【发布时间】:2019-07-08 14:22:35
【问题描述】:

自从我开始我的第一个 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) 的糟糕页面。为什么我收到此错误,而不是打开/保存对话框?

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

编辑 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');
    }
}

【问题讨论】:

  • 试图处理不是对象的东西,就好像它是一个对象一样。通常是因为代码中稍早一些的东西返回了一个错误(通常是一个布尔值),而不是它预期返回的对象。这意味着您没有检查错误
  • 您必须查看文档以了解如何将$data 传递给PDF::loadView。我猜它没有从View::share获得份额
  • 您确定$id 存在于数据库中吗?
  • @Jerodev 我确定我使用了表中存在的$id(1234,因为它很容易记住)
  • 另外我忘了补充一点,当它没有$id 时它可以工作,调用所有表并使用@foreach 访问数据

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


【解决方案1】:

当您执行find($id) 并且记录不存在时,它会返回null。所以如果你尝试访问任何属性-&gt;column,它会抛出错误。

你可以做findOrFail($id) 有条件if (is_null($data)) 在前端有$data->column ?? 'defaultvalue '

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

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

如果存在,您应该会看到您尝试访问的column

最后,如果它在上述步骤中不存在但在表格中,则检查您的模型的 protected $hidden = [] 设置,该设置基本上隐藏了某些列。

【讨论】:

  • 在尝试解决这个问题时,我使用了$data = Table2::with('Table')-&gt;where('id', $id)-&gt;get();,由于某种原因它没有问题,但是如果我使用-&gt;first();而不是-&gt;get();,它会返回Trying to get property 'column' of non-object错误,这是为什么呢?
  • 该模型上是否有任何访问器或附加属性?
  • 什么是访问器和附加模型?
  • accessorappended properties :) 简而言之,附加属性是一个附加属性,它不是您的列之一。就像全名一样,名字和姓氏的组合。访问器是一个修改列的基本值的函数。
  • 谢谢 c:我认为问题出在我使用的 dompdf 包装器上(barryvdh/laravel-dompdf,我忘了在问题中添加),因为当我卸载它并安装了正常版本的dompdf 问题停止出现(使用该特定控制器)
【解决方案2】:

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

尝试如下更改您的代码:

Table::findOrFail($id);

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

【讨论】:

  • 感谢您的快速响应,问题是,我确定我选择了一个我知道存在的 ID,也是的,findOrFail 确实返回了 404
  • 问题可能出在你的模型上,把你的模型代码放在这里。
  • 尝试使用Table::where('id',$id)-&gt;first(); 访问您的数据,看看是否适合您!
  • 不,我收到 trying to get property 'column' of non-object 错误
  • 试试dd($id) 看看有没有号码分配给它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 2016-09-10
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 2018-05-23
相关资源
最近更新 更多