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

时间:2017-10-07 07:42:41

标签: laravel laravel-5 eloquent

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
},

3 个答案:

答案 0 :(得分:0)

你差不多完成了,你的关系设置很好,除了布尔的东西,删除它:

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

然后,当您需要检查时,您可以使用haswhereHas关系方法:

$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()