【问题标题】:Laravel: Trying to get property of non-Object ErrorLaravel:试图获取非对象错误的属性
【发布时间】:2018-06-02 22:13:23
【问题描述】:

我有三张桌子,即:

网站:

id|name|slug|location|description

帐号:

id|accountname|slug

交易:

id|name|slug|site_id|accounthead_id|...

我的站点模型如下所示:

class Site extends Model
{
    protected $fillable = [
        'name',
        'slug',
        'location',
        'description'
    ];

    public function transactions()
    {
        return $this->hasMany('App\Transaction', 'site_id');
    }
}

我的 AccountHead 模型如下所示:

class AccountHead extends Model
{
    protected $fillable = [
        'slug',
        'accountname'
    ];

    public function transactions()
    {
        return $this->hasMany('App\Transaction','accounthead_id');
    }
}

我的交易模型看起来像:

class Transaction extends Model
{
    public function site()
    {
        return $this->belongsTo('App\Site','id');
    }
    public function accounthead()
    {
        return $this->belongsTo('App\AccountHead','id');
    }
}

在我的一个刀片中,我想显示所有交易和相关字段:

我的刀片文件

@forelse($transactions as $key => $transaction)
<tr>
    <td>{{++$key}}</td>
    <td>{{$transaction->updated_at->format('M d Y')}}</td>
    <td>{{str_limit($transaction->name, 47) }}</td>
    <td>{{str_limit($transaction->accounthead->accountname,47)}}</td>
    <td>{{str_limit($transaction->site->Name,47)}}</td>
    <td>{{str_limit($transaction->amount,47)}}</td>
</tr>
@empty
<tr>
    <td colspan="4" class="text-center">No Transactions available.</td>
</tr>
@endforelse

它工作正常,除非一个网站/AccountHead 用于多个交易。一旦一个网站/账户头被用于不止一个交易它的抛出:

(2/2) ErrorException
Trying to get property of non-object

我在这里错过了什么非常愚蠢的东西吗?

【问题讨论】:

    标签: php database laravel eloquent relationship


    【解决方案1】:

    问题是您的代码中的拼写错误。而不是:

    str_limit($transaction->accountheads->accountname,47)
    

    你应该有:

    str_limit($transaction->accounthead->accountname,47)
    

    因为这是你们关系的名称。

    也可能会在以后发生您没有 accounthead 的某些关系 - 在这种情况下,请查看 Laravel 5 get data other table

    【讨论】:

    • 我很抱歉,但这只是问题中的错字。我已经编辑了这个问题。错误仍然存​​在。
    【解决方案2】:

    首先,你应该修复关系:

    public function site()
    {
        return $this->belongsTo('App\Site', 'site_id', 'id');
    }
    
    public function accounthead()
    {
        return $this->belongsTo('App\AccountHead', 'accounthead_id' 'id');
    }
    

    或者只是:

    public function site()
    {
        return $this->belongsTo('App\Site');
    }
    
    public function accounthead()
    {
        return $this->belongsTo('App\AccountHead');
    }
    

    之后,如果仍然无法正常工作,您需要确保每笔交易都有“站点”和“账户头”关系。换句话说,transactions 表中的每一行在site_idcolumn_id 列中都应该有一个正确的ID。

    如果不是每笔交易都有站点或账户头,你需要在尝试使用相关对象属性之前检查它:

    <td>{{ str_limit(optional($transaction->accounthead)->accountname, 47) }}</td>
    <td>{{ str_limit(optional($transaction->site)->Name, 47) }}</td>
    

    【讨论】:

    • 我认为这是主要问题,如果他有site_idTransaction 他只留下第二和第三个参数,
    • 观察事务表中的一些数据后,我注意到值为'0'的site_id和accounthead_id导致了这个错误。我从 { Form::select} 中获取这些值,它给出了列表中站点或帐户头的索引。
    猜你喜欢
    • 2016-06-13
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2020-10-21
    相关资源
    最近更新 更多