2017-10-07 74 views
1

Stack模型可以有「用戶進度」,用戶可以「清除」堆棧。並且該進度存儲在Progress模型中。返回一個布爾值而不是整個集合

Progress型號:

public function stack(){ 
    return $this->belongsTo(Stack::class); 
} 

這將是整齊的,如果有可能獲取所有堆棧,如果用戶已經「清除」與否,有一個布爾值true或false。我不會不取回與進度相對應的所有數據。所以,我試圖建立在Stack模型

public function finished(){ 
    return $this->hasOne(Progress::class) ? true : false; 
} 

「已完成」的關係,但這種設置使我有以下錯誤 Call to a member function addEagerConstraints() on boolean

這是我如何調用的關係,此刻

$user = \App\Stack::with(['finished' => function($q){ 
     return $q->where('user_id', auth()->user()->id); 
    }])->get(); 

但返回的整個集合,這是沒有必要的。預期的結果應該是這樣的:

{ 
"id": 5, 
"user_id": 2, 
"subject_id": 2, 
"name": "tstar igen", 
"slug": "tstar-igen", 
"description": "asdasd", 
"image": null, 
"created_at": "2017-10-06 08:27:36", 
"updated_at": "2017-10-06 08:27:36", 
"finished": true/false 
}, 

因此,可以說,這裏是在上面堆的關係進入在進度表。

+----+---------+----------+ 
| id | user_id | stack_id | 
+----+---------+----------+ 
| 1 |  1 |  5 | 
+----+---------+----------+ 

所以當提取堆棧時,關係完成。 finished列應該是true或false。所以從Stack返回,關係finished應該如下。請注意,最後一個堆棧中已完成的列已更改爲false,因爲關係在進度表中不存在。當你需要檢查你可以使用haswhereHas關係法

public function finished(){ 
    return $this->hasOne(Progress::class); 
} 

然後:

{ 
"id": 5, 
"user_id": 2, 
"subject_id": 2, 
"name": "tstar igen", 
"slug": "tstar-igen", 
"description": "asdasd", 
"image": null, 
"created_at": "2017-10-06 08:27:36", 
"updated_at": "2017-10-06 08:27:36", 
"finished": true 
}, 
{ 
"id": 6, 
"user_id": 2, 
"subject_id": 2, 
"name": "another stack", 
"slug": "another-stack", 
"description": "This is a test stack for all the stacks out there", 
"image": null, 
"created_at": "2017-10-06 08:27:36", 
"updated_at": "2017-10-06 08:27:36", 
"finished": false 
}, 
+0

你能解釋一下你的問題你試圖達到什麼嗎?你想過濾所有用戶的「完成」狀態爲「真」或「假」的堆棧? –

+0

編輯我的問題的更多信息 – Adam

回答

0

快要大功告成,你有你的關係,建立良好除了布爾東西,刪除它

$stack = \App\Stack::whereHas('finished', function($q){ 
    return $q->where('user_id', auth()->user()->id); 
})->get(); 

根據您的需要,這是最好的,我可以構想。我認爲這應該足夠了。

這將很好地學習如何has and whereHas的作品。但總結一下:has簡直就像whereHas,不同之處在於它檢查是否至少有一個與第一個模型相關的模型,另一個可以幫助您制定更高級的約束,如我給出的示例所示。

+0

感謝您的迴應!但是,我正在嘗試爲堆棧模型構建API,以便跟蹤用戶進度。所以需要所有的堆棧,如果他們完成或沒有。 – Adam

0

您可以嘗試withCount來計算您的相關型號。但它會返回不是布爾型的相關模型的數量。這裏是一個例子:

堆棧。PHP

public function progress(){ 
    return $this->hasOne(Progress::class); 
} 

則:

\App\Stack::withCount('progress')->get(); 

現在結果有count_progress屬性與相關的 '進步' 車型的數量。因爲你的關係是hasOne它應該是0或1.

相關問題