2015-11-18 70 views
0

我開始從一個表中返回的項目數據提供了基本查詢時:Laravel 5 - 未定義的屬性使用關係

$project = Project::find($id); 
return view('project.show')->with('project', $project); 

然後我的網頁我dd()上倒是在$project->id和它的工作。

我現在也有一個名爲user的表。

一個項目屬於用戶的,所以我有一個關係,在我的模型建立:

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

然後我做的:

$project = Project::with('user')->where('id', $id)->get(); 

但我得到的錯誤:

Undefined property: Illuminate\Database\Eloquent\Collection::$id

如果我只是dd()$project

Collection {#200 ▼ 
    #items: array:1 [▼ 
    0 => Project {#196 ▼ 
     #fillable: array:1 [▶] 
     #dates: array:2 [▶] 
     #connection: null 
     #table: null 
     #primaryKey: "id" 
     #perPage: 15 
     +incrementing: true 
     +timestamps: true 
     #attributes: array:5 [▶] 
     #original: array:5 [▶] 
     #relations: array:1 [▶] 
     #hidden: [] 
     #visible: [] 
     #appends: [] 
     #guarded: array:1 [▶] 
     #dateFormat: null 
     #casts: [] 
     #touches: [] 
     #observables: [] 
     #with: [] 
     #morphClass: null 
     +exists: true 
     +wasRecentlyCreated: false 
    } 
    ] 
} 

我在做什麼錯?

爲了澄清,我希望能夠做到:

$project->id 
$project->user->name 
+0

您將在這裏找到http://stackoverflow.com你awnser/questions/27598603 /尋找和獲取口才的區別 – SillasSoares

+0

您能否爲'projects'和'user'表提供模式? – Dencker

回答

1

get()方法將總是返回一個Illuminate\Database\Eloquent\Collection對象。這意味着您的$project變量是Collection,因此當您嘗試$project->id時,您試圖訪問不存在的Collection上的id屬性。這就是你得到錯誤的原因。

有幾種不同的方式可以知道你想要做什麼。它們在下面的代碼中顯示。他們都非常相當。

// This is your code, just added the call to first() on the Collection 
// to get the first item in the Collection 
$project = Project::with('user')->where('id', $id)->get()->first(); 

// This is a little more efficient. It is calling first() on the QueryBuilder. 
// This will directly return the desired object, without having to create 
// an intermediate Collection. 
$project = Project::with('user')->where('id', $id)->first(); 

// This is equivalent to the previous statement, just a little cleaner. 
// find() is just a shortcut for where('id', $id)->first(). 
$project = Project::with('user')->find($id); 

所有三個上述聲明將讓你的Project對象,然後你就可以作爲使用你想:

$project = Project::with('user')->find($id); 

// print the id 
echo $project->id.PHP_EOL; 

// if the user exists, print the name 
if ($project->user) { 
    echo $project->user->name.PHP_EOL; 
} 
+0

感謝您花時間解釋:)爲我排序問題。 – Lovelock

0

試着這麼做

$project = Project::with('user')->find($id); 
+0

該聲明將返回所有項目,並且所有用戶都將被加載。 find()會返回一個模型實例,但是隨後調用'with()'將會返回一個新的查詢構建器,然後你調用'get()',這將返回所有的項目。 – patricus

0

我會做這樣的:

控制器:

Project::where('id', $id)->get(); 

模型

public function user(){ 
return $this->belongsTo(User::class); 
} 

查看

@foreach($project as $i) 
{{ $i->user->user_id }} 
+0

這就是他已經在他的問題中提到的 –