2015-09-05 110 views
0

我似乎遇到了問題。我有我的索引控制器,做到這一點:Laravel 5 - 試圖獲取非對象的屬性

public function index() 
{ 
    $projects = Project::dateDescending()->get(); 
    return view('projects.index', compact('projects')); 
} 

如果我傾倒$projects,我可以看到我有兩個對象。一個項目的屬性是

"clientId" => 1 

一個Project有一個ClientClient屬於Project,這是所有設置。在我的索引視圖,我這樣做:

@foreach($projects as $project) 
<tr> 
    {!! Form::open(array('class' => 'form-inline', 'method' => 'DELETE', 'route' => array('projects.destroy', $project->id))) !!} 
     <td>{{ $project->id }}</td> 
     <td>{{ $project->clientId->clientName }}</td> 
     <td>{{ $project->clientStatus }}</td> 
     <td>{{ $project->projectName }}</td> 
     <td>{!! link_to_route('projects.show', 'Show', array($project->id), array('class' => 'btn btn-info')) !!}</td> 
     <td>{!! link_to_route('projects.edit', 'Edit', array($project->id), array('class' => 'btn btn-info')) !!}</td> 
     <td>{!! Form::submit('Delete', array('class' => 'btn btn-danger')) !!}</td> 
    {!! Form::close() !!} 
</tr> 
@endforeach 

出於某種原因,我得到一個錯誤,因爲這條線的

<td>{{ $project->clientId->clientName }}</td> 

但我可以有機會獲得clientName因爲建立的關係?

這是奇怪的部分。如果我只有一個項目在數據庫中,客戶端名稱顯示正常。只有當我添加第二個項目時,我得到這個錯誤。

可能是什麼造成的?

UPDATE

我的遷移是像這樣:

Schema::create('clients', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->string('clientName')->default(''); 
    $table->string('contactEmail')->default(''); 
    $table->string('slug')->default(''); 
    $table->timestamps(); 
}); 

Schema::create('projects', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->integer('clientId')->unsigned()->default(0); 
    $table->foreign('clientId')->references('id')->on('clients')->onDelete('cascade'); 
    $table->string('contactName')->default(''); 
    $table->string('projectName')->default(''); 
    $table->timestamps(); 
}); 

我的客戶模型:

class Client extends Model 
{ 
    protected $table = 'clients'; 
    protected $guarded = []; 

    public function project() 
    { 
     return $this->belongsTo('App\Project', 'clientId'); 
    } 
} 

我的項目模型:

class Project extends Model 
{ 
    protected $table = 'projects'; 
    protected $guarded = []; 

    public function scopeDateDescending($query) 
    { 
     return $query->orderBy('created_at','DESC'); 
    } 

    public function client() 
    { 
     return $this->hasOne('App\Client', 'id'); 
    } 
} 

回答

1

這聽起來不像你有正確的關係設置。由於您的項目表包含客戶端表(projects.clientId)的外鍵,這意味着該項目屬於客戶端,客戶端擁有一個或多個項目。

你的模型應該是這個樣子:

class Project extends Model 
{ 
    public function client() 
    { 
     return $this->belongsTo('App\Client', 'clientId'); 
    } 
} 

class Client extends Model 
{ 
    public function project() 
    { 
     return $this->hasOne('App\Project', 'clientId'); 
    } 
} 

現在,從你的項目,你可以通過client關係訪問客戶信息:

<td>{{ $project->client->clientName }}</td> 
1

您是否在您的模型中添加了客戶端項目關係。 請參閱http://laravel.com/docs/5.1/eloquent-relationships#one-to-one

此外,如果您已添加它,您是否以正確的方式使用它。 我認爲,它應該更像

$項目 - >客戶 - > CLIENTNAME

這將是有益的,如果你能在這裏展示的模型的代碼。

+0

我有更新的詳細信息,OP,謝謝 –

+0

在你的項目模型中試試這個, public function client() return $ this-> hasOne('App \ Client','id','clientId'); } 然後按照上面所述的方式引用您的客戶。 –

相關問題