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,因为进度表中不存在该关系。
{
"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)
你差不多完成了,你的关系设置很好,除了布尔的东西,删除它:
public function finished(){
return $this->hasOne(Progress::class);
}
然后,当您需要检查时,您可以使用has
或whereHas
关系方法:
$stack = \App\Stack::whereHas('finished', function($q){
return $q->where('user_id', auth()->user()->id);
})->get();
根据您的需要,我能想到的最好的。我认为这应该足够了。
了解has and whereHas如何运作会很好。但总结一下:has
就像whereHas
一样,只是它检查是否存在至少一个与第一个模型相关的模型,另一个帮助您制作更高级的约束,如示例所示我给了。
答案 1 :(得分:0)
您可以尝试计算相关模型的 \App\Stack::withCount('progress')->get();
。但它会返回相关模型的数量而不是布尔值。这是一个例子:
<强> Stack.php 强>
count_progress
然后:
hasOne
现在,结果具有ExtractJwt.fromAuthHeaderWithScheme('jwt')
属性,其中包含相关“进度”模型的数量。因为您的关系是ExtractJwt.fromAuthHeaderAsBearerToken();
,所以它应该是0或1。
答案 2 :(得分:0)
您的模型
public function progress(){
return $this->hasOne(Progress::class);
}
您的控制器
...
$stacks->load('progress');
资源
'finished' => $this->whenLoaded('progress')->isNotEmpty()