2017-06-05 63 views
1

我有關係hasMany的問題。這是我的代碼:Laravel 5.4試圖獲得非物件的財產

在模型文件,我有:

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

在模型別名:

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

在Controller中,我做了一個foreach以避免集合:

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

在視圖:

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 

問題是,當我試圖讓屬性名稱或視圖中的關係文件()的另一個屬性槽:

$alias->document->name 

回答

2

控制器您的數據陣列碼並不能解決什麼問題?爲什麼要將一個集合(實現ArrayAccess接口)轉換爲一個數組?

,並通過設置:

$data['aliases'] = []; 

該語句將永遠是正確的:

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

你的問題是,您是從非對象申請的名稱,沒有文件爲那裏的別名。

我看到您在視圖中使用$alias->doc_id,我假設這是Alias模型上的Document模型外鍵,doc_id不是根據命名約定而是不會自動解析的。如果沒有定義,Laravel預計它是document_id。您使用doc_id作爲外鍵,這不符合命名約定,因此您必須定義它。

試試這個:

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




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

欲瞭解更多信息,請參閱:Laravel - One-to-many relationships

也會檢出預先加載(保存查詢),如果沒有一個文件可以存在一個別名,你應該如果存在文檔檢查您嘗試訪問文檔的屬性之前,您的foreach。

+0

這是工作!我雖然認爲如果你定義了其他外鍵,而不是Laravel在遷移中期望的,你不需要在關係中定義它。我錯了。謝謝羅伯特!我將數組轉換爲數組,因爲如果不是,我不能接受這個屬性:$ alias-> doc_id directely。也許還有另一種方式。 – nature

相關問題