【问题标题】:Return a Boolean instead of the whole collection返回一个布尔值而不是整个集合
【发布时间】:2017-10-07 07:42:41
【问题描述】:

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 列应为真或假。所以来自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
},

【问题讨论】:

  • 您能否从您的问题中更好地解释您要达到的目标?您想过滤用户“已完成”状态为“真”或“假”的所有堆栈?
  • 用更多信息编辑了我的问题

标签: laravel laravel-5 eloquent


【解决方案1】:

您可以尝试withCount 计算您的相关模型。但它会返回相关模型的数量而不是布尔值。这是一个例子:

Stack.php

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

然后:

 \App\Stack::withCount('progress')->get();

现在结果具有count_progress 属性以及相关“进度”模型的数量。因为你的关系是hasOne,所以它应该是 0 或 1。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回复!但是,我正在尝试为堆栈模型构建 API,以便跟踪用户进度。所以需要所有的堆栈,以及它们是否完成。
    【解决方案3】:

    你的模型

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

    您的控制器

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

    资源

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

    【讨论】:

      猜你喜欢
      • 2011-09-13
      • 2013-08-04
      • 2017-04-22
      • 2020-02-13
      • 2014-05-16
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多