2017-12-20 6 views
1

Ich habe drei Tabellen nämlich:Laravel: Der Versuch, Eigentum der Nicht-Objektfehler zu erhalten

Site:

id|name|slug|location|description 

Accounthead:

id|accountname|slug 

Transaktion:

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

My Site-Modell wie folgt aussieht:

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

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

Mein AccountHead Modell wie folgt aussieht:

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

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

Und mein Transaktionsmodell wie folgt aussieht:

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

In Einer meiner Klinge möchte ich alle Transaktionen angezeigt werden und die zugehörigen Felder:

Meine Klinge Datei

@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 

Es funktioniert gut, wenn man nicht Website/AccountHead ist verwendet für mehr als eine Transaktion. Einmal Standort/Accounthead ist für mehr als eine Transaktion Sein Wurf verwendet:

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

Fehle ich etwas wirklich dumm hier?

Antwort

1

Zunächst einmal sollten Sie die Beziehungen beheben:

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

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

Or nur:

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

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

Danach, wenn es immer noch nicht funktioniert, müssen Sie jede Transaktion, um sicherzustellen, beide ‚Standort‘ hat und ‚accounthead‘ relationshi ps.Mit anderen Worten, jede Zeile in der Tabelle transactions sollte eine korrekte ID in den Spalten site_id und column_id haben.

Wenn nicht jede Transaktion Website oder Konto Kopf hat, müssen Sie es überprüfen, bevor Sie versuchen verwandte Objekteigenschaft zu verwenden:

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

Ich denke, das ist das Hauptproblem, Wenn er 'site_id' Spalte für' Transaction' hat, dann hinterlässt er den zweiten und dritten Parameter, – OIIO

+0

Nachdem ich einige Daten in der Transaktionstabelle beobachtet habe, bemerke ich die site_id und accoehead_id mit dem Wert '0' verursachten diesen Fehler. Ich erhalte diese Werte von {Form :: select}, das den Index der Website oder des Accountheads in der Liste angibt. –

3

Das Problem ist Tippfehler in Ihrem Code. Statt:

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

sollten Sie haben:

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

denn das ist der Name Ihrer Beziehung ist.

Auch kann es passieren, später, dass Sie nicht über accounthead für einige Beziehung - in einem solchen Fall einen Blick auf Laravel 5 get data other table

+0

Es tut mir leid, aber das waren nur die Tippfehler in der Frage. Ich habe die Frage bearbeitet. Der Fehler herrscht immer noch vor. –

Verwandte Themen