Laravel:尝试获取非对象错误的属性

问题描述 投票:1回答:2

我有三张桌子即:

现场:

id|name|slug|location|description

Accounthead:

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

它工作正常,除非一个Site / AccountHead用于多个Transaction。一旦站点/账户头被用于多个交易,它就会抛出:

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

我错过了这里真正愚蠢的事吗?

php database laravel eloquent relationship
2个回答
1
投票

首先,你应该修复关系:

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>

3
投票

问题是代码中的拼写错误。代替:

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

你应该有:

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

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

也可能在以后你没有accounthead的某种关系 - 在这种情况下看看Laravel 5 get data other table

© www.soinside.com 2019 - 2024. All rights reserved.