返回一个布尔值而不是整个集合
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,因为关系在进度表中不存在。当你需要检查你可以使用has
或whereHas
关系法
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
},
快要大功告成,你有你的关系,建立良好除了布尔东西,删除它
$stack = \App\Stack::whereHas('finished', function($q){
return $q->where('user_id', auth()->user()->id);
})->get();
根据您的需要,这是最好的,我可以构想。我认为这应该足够了。
这将很好地学习如何has and whereHas的作品。但总结一下:has
简直就像whereHas
,不同之处在于它检查是否至少有一个与第一个模型相关的模型,另一个可以帮助您制定更高级的约束,如我给出的示例所示。
感谢您的回应!但是,我正在尝试为堆栈模型构建API,以便跟踪用户进度。所以需要所有的堆栈,如果他们完成或没有。 – Adam
您可以尝试withCount
来计算您的相关型号。但它会返回不是布尔型的相关模型的数量。这里是一个例子:
堆栈。PHP
public function progress(){
return $this->hasOne(Progress::class);
}
则:
\App\Stack::withCount('progress')->get();
现在结果有count_progress
属性与相关的 '进步' 车型的数量。因为你的关系是hasOne
它应该是0或1.
你能解释一下你的问题你试图达到什么吗?你想过滤所有用户的“完成”状态为“真”或“假”的堆栈? –
编辑我的问题的更多信息 – Adam