2017-10-07 44 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.

相关问题