Laravel 返回布尔值,而不是整个集合

Laravel 返回布尔值,而不是整个集合,laravel,laravel-5,eloquent,Laravel,Laravel 5,Eloquent,堆栈模型可以有“用户进度”,用户可以“清除”堆栈。该进度存储在进度模型中 进度型号: public function stack(){ return $this->belongsTo(Stack::class); } 如果可以获取所有堆栈,并且如果用户使用布尔值true或false“清除”了所有堆栈,那么这将是一个不错的选择。我不想获取与进度对应的所有数据。因此,我尝试在堆栈模型上设置一个“完成”关系 public function finished(){ return

堆栈
模型可以有“用户进度”,用户可以“清除”堆栈。该进度存储在
进度
模型中

进度
型号:

public function stack(){
    return $this->belongsTo(Stack::class);
}
如果可以获取所有堆栈,并且如果用户使用布尔值true或false“清除”了所有堆栈,那么这将是一个不错的选择。我不想获取与进度对应的所有数据。因此,我尝试在
堆栈
模型上设置一个“完成”关系

public function finished(){
    return $this->hasOne(Progress::class) ? true : false;
}
但是这个设置给了我以下错误
调用布尔函数上的成员函数addagerConstraints()

这就是我现在对这种关系的称呼

    $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 |
+----+---------+----------+
因此,在获取堆栈时,使用关系finish。
finished
列应为true或false。因此,从
堆栈
返回的具有关系的
finished
应该如下所示。请注意,在最后一个堆栈上,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
},

您几乎完成了,您的关系设置良好,除了布尔值,请将其删除:

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
whereHas
类似,只是它检查是否至少有一个模型与第一个模型相关,另一个模型帮助您建立更高级的约束,如我给出的示例所示。

您可以尝试使用count
对相关模型进行计数。但它将返回相关模型的数量,而不是布尔值。以下是一个例子:

Stack.php

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


现在,结果具有
count\u progress
属性和相关“progress”模型的数量。因为您的关系是hasOne,所以应该是0或1。

您的模型

public function progress(){
    return $this->hasOne(Progress::class);
}
您的控制器

...
$stacks->load('progress');
资源

'finished' => $this->whenLoaded('progress')->isNotEmpty()

谢谢你的回复!但是,我正在尝试为堆栈模型构建和API,以便跟踪用户进程。所以需要所有的堆栈,以及它们是否完成。你能从你的问题中更好地解释你想要实现什么吗?是否要筛选用户“已完成”状态为“真”或“假”的所有堆栈?请使用更多信息编辑我的问题
'finished' => $this->whenLoaded('progress')->isNotEmpty()