【问题标题】:Laravel: take(1)->count(); what does this mean?Laravel: take(1)->count();这是什么意思?
【发布时间】:2015-08-07 17:43:34
【问题描述】:

我正在研究一个包的源代码,rtConner/laravel-tagging。在这个包中有一个名为TaggableTrait 的特征。在第 179 行,在一个名为 addTag() 的方法中,有一行我不明白:

$previousCount = $this->tagged()->where('tag_slug', '=', $tagSlug)->take(1)->count();

这条线有什么作用?具体来说,我的问题是 ->take(1)->count(); 部分,我们是否从 where 子句中取出 1 个条目然后计算它?

【问题讨论】:

  • 看起来这里的逻辑是取第一个匹配 tag_slug 并计算你得到了多少。所以它返回 1 或 0。我猜这是类型杂耍的方式。计数在那里所以我们得到数字而不是标记的对象。
  • 只有与groupBy 一起使用才有意义。否则它是多余的,正如下面的答案中已经说明的那样。

标签: laravel eloquent relationship


【解决方案1】:

来自 Laravel 文档:

采取(int $value)

设置查询“限制”值的别名。

所以基本上你所做的就是用Query Builder 构造一个查询,你实际上是在说:

选择所有标签的计数,其中tag_slug为$tagSlug并返回第一行

等于

SELECT COUNT(*) FROM tags WHERE tag_slug = 'blabla' LIMIT 1

由于COUNT() 是聚合函数,它将始终返回一行(与 where 条件匹配的所有行的计数),因此->take(1) 已过时,无论有无它都会为您提供相同的结果。

【讨论】:

  • LIMIT不是应用在COUNT()之前吗?
  • 不,您可以在MySQL documentation 页面上查看模拟和执行语句的顺序。在完成所有过滤并且我们有一个行集之后应用限制。
  • 我明白了。那么它确实已经过时了。
  • @lukasgeiter 抱歉,没看到。
猜你喜欢
  • 2019-04-24
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 2019-01-15
  • 2012-12-26
  • 2021-05-25
  • 2017-06-30
  • 1970-01-01
相关资源
最近更新 更多