2017-06-05 5 views
1

Ich habe ein Problem mit einer Beziehung hasMany. Dies ist mein Code:Laravel 5.4 Versuch, die Eigenschaft von Nicht-Objekt zu bekommen

Im Modell Dokument, ich habe:

public function aliases() 
{ 
    return $this->hasMany('App\Models\Alias'); 
} 

In Modell Alias:

public function document() 
{ 
    return $this->belongsTo('App\Models\Document'); 
} 

im Controller habe ich eine foreach macht eine Sammlung zu vermeiden, :

$data['aliases'] = []; 
$aliases = Alias::where('path', $directory)->get(); 
if(null != $aliases){ 
    foreach($aliases as $alias){ 
     $data['aliases'][] = $alias; 
    } 
} 

Nach Ansicht:

if(isset($data['aliases'])) 
    @foreach($data['aliases'] as $alias) 
     <tr> 
      <td>{!! HTML::image('images/panel/icons/alias.svg', '', array('class' => 'icons_type')) !!}</td> 
      <td><a href="{{ route('documents.show', '', $alias->doc_id) }}">{!! $alias->document->name !!}</a></td> 
      <td>{{--{!! date('d-m-Y', strtotime($alias->document->date)) !!}--}}</td> 
      <td>{{--{!! $alias->document->class !!}--}}</td> 
     </tr> 
    @endforeach 
@endif 

Das Problem ist, wenn ich versuche, den Eigenschaftsnamen oder eine andere Eigenschaft Trog Beziehung Dokument() in der Ansicht zu erhalten:

$alias->document->name 

Antwort

2

Ihre Datenarray-Code in der Steuerung keine Lösung? Warum möchten Sie eine Sammlung (die die ArrayAccess-Schnittstelle implementiert) in ein Array konvertieren?

Und indem:

$data['aliases'] = []; 

Diese Aussage immer wahr sein:

if(isset($data['aliases'])) 

Das Problem, das Sie ist hat, dass Sie den Namen von einem Nicht-Objekt anfordern, gibt es kein Dokument für den Alias ​​dort.

Ich sehe, dass Sie $alias->doc_id in der Ansicht verwenden, nehme ich an, dass dies der Dokumentmodell Fremdschlüssel im Alias-Modell ist, doc_id ist nicht nach der Namenskonvention und wird nicht automatisch auflösen. Falls nicht definiert, erwartet Laravel, dass es document_id ist. Sie verwenden doc_id als Fremdschlüssel, der nicht den Namenskonventionen entspricht, also müssen Sie ihn definieren.

Try this:

public function aliases() 
{ 
    return $this->hasMany('App\Models\Alias', 'doc_id'); 
} 




public function document() 
{ 
    return $this->belongsTo('App\Models\Document', 'doc_id'); 
} 

Für weitere Informationen siehe: Laravel - One-to-many relationships

Auch eager loading Kasse (spart Abfragen) und wenn ein Alias, ohne ein Dokument vorhanden sein können, sollten Sie prüfen, ob das Dokument existiert in Ihre foreach, bevor Sie versuchen, auf Eigenschaften des Dokuments zuzugreifen.

+0

Es ist Arbeit! Wenn Sie jedoch einen anderen Fremdschlüssel definiert haben, den Laravel in den Migrationen erwartet hat, müssen Sie ihn nicht in der Beziehung definieren. Ich habe mich geirrt. Danke Robert! Ich konvertiere die Sammlung in ein Array, denn wenn nicht, könnte ich die Eigenschaft nicht nehmen: $ alias-> doc_id direkt. Vielleicht gibt es einen anderen Weg. – nature

Verwandte Themen