【问题标题】:Complex-ish query in Laravel (Eloquent)Laravel 中的复杂查询(Eloquent)
【发布时间】:2014-08-18 08:40:22
【问题描述】:

我已经阅读了 Laravel 文档,但我无法完全解决这个问题。

有谁知道这个查询在 Eloquent 中是否可行?

如果是这样,你会怎么写?

SELECT 

MONTHNAME(postdate) as monthname, 
DATE_FORMAT(postdate,'%m') as month, 
YEAR(postdate) as year, 
COUNT(MONTHNAME(postdate)) as num 

FROM 
postData 

WHERE 
status = 1 

GROUP BY 
monthname,
year 

ORDER BY 
postdate DESC

【问题讨论】:

  • 有理由不只使用 DB::raw() 或 selectRaw() 吗?只是好奇
  • @KyleK 我猜如果他问这样的问题而没有提及这可能是因为他不知道DB::rawselectRaw
  • 嗯,是的...我不确定,因为他特别把(口才)放在括号里,所以我想也许他特别想要一个口才/流利的版本

标签: php sql laravel laravel-4 eloquent


【解决方案1】:

如果您不介意使用 DB::raw(),请执行此操作...

轻松复制...

DB::select(DB::raw("SELECT MONTHNAME(postdate) as monthname, DATE_FORMAT(postdate,'%m') as month, YEAR(postdate) as year, COUNT(MONTHNAME(postdate)) as num FROM postData WHERE status = 1 GROUP BY monthname,year ORDER BY postdate DESC"));

一行...

  DB::select(DB::raw("SELECT MONTHNAME(postdate) as monthname, DATE_FORMAT(postdate,'%m') as month,YEAR(postdate) as year, COUNT(MONTHNAME(postdate)) as num FROM postData WHERE status = 1 GROUP BYmonthname,year ORDER BY postdate DESC"));

【讨论】:

  • 忘记在查询周围添加"
  • 谢谢凯尔克。是的,我不知道如何正确使用 DB::raw。
【解决方案2】:

虽然在整个查询中简单地使用DB::raw 确实有效,但我觉得它不合适。您可能想使用查询生成器尝试此解决方案。

DB::table('postData')->select([
    DB::raw('MONTHNAME(postdate) AS monthname'),
    DB::raw('DATE_FORMAT(postdate, \'%m\') AS month'),
    DB::raw('YEAR(postdate) AS year'),
    DB::raw('COUNT(MONTHNAME(postdate)) AS num'),
])->where('status', 1)
  ->groupBy('monthname', 'year')
  ->orderBy('postdate', 'DESC');

它仍然使用DB::raw,但仅用于选择子句。无论如何,您可以使用 PostData 模型而不是 DB::table('postData'),但由于它确实不是常规的 PostData 对象,我建议不要这样做。

【讨论】:

  • 这就是我所追求的。谢谢。我能问一下您所说的 PostData 对象是什么意思吗?我的意图是像这样开始查询: $posts = $this->posts->select([...
  • 哦,您正在通过另一个模型作为关系访问。你看,每当我有一个模型时,我希望它拥有它映射到的表的所有字段。因此,如果我返回 PostData,我希望它具有 postdatestatus 属性,而不是您使用 AS 子句指定的自定义属性。 PS:如果你真的把它当作一种关系,请记住你实际上必须这样做$this->posts()->select(...。注意posts() 而不是posts。这是由于 Laravel 处理魔法属性的方式。
  • 谢谢拉斐尔。我感谢详细的解释。
猜你喜欢
  • 2015-12-06
  • 2021-11-16
  • 2015-05-16
  • 2021-02-02
  • 2013-05-30
  • 2014-04-27
  • 2018-02-02
  • 2019-02-15
  • 1970-01-01
相关资源
最近更新 更多