【问题标题】:Cannot use SQL_CALC_FOUND_ROWS and FOUND_ROWS() in Laravel manual query?在 Laravel 手动查询中不能使用 SQL_CALC_FOUND_ROWS 和 FOUND_ROWS()?
【发布时间】:2016-03-04 12:24:16
【问题描述】:

我正在使用 Laravel 5.2 开发一个数据库驱动的网站。我正在使用 Laravel 的手动查询生成器。

我要做的是在第一个查询中使用SQL_CALC_FOUND_ROWS,并在第二个查询中选择FOUND_ROWS()。但它不能正常工作。我的代码如下。

$param = array();
$sql = "SELECT SQL_CALC_FOUND_ROWS `report_items`.`id`,`items`.`name` as `item_name`,`items`.`id` as `item_id`,`items`.`item_code`,`report_items`.`created_at`";
$sql .= ",`users`.`name` as `username`,`users`.`id` as `user_id`";
$sql .= " FROM `report_items` INNER JOIN `items` ON `items`.id=`report_items`.`item_id`";
$sql .= " INNER JOIN `users` ON `users`.`id`=`report_items`.`user_id`";
$sql .= " WHERE 1=1";

$sql .= " LIMIT ?,?";
$param[] = (int)$offset;
$param[] = (int)$limit;

$rows = DB::select($sql,$param);
$count = DB::select("SELECT FOUND_ROWS() as `row_count`")[0]->row_count;

如您所见,我想在第二个查询中检索找到的行。但它没有按预期工作。

第一个查询实际上返回 3 行。但是当我从第二个查询中检索结果时,行数始终为 1。

我的查询有什么问题?

【问题讨论】:

  • 难道 laravel 在每次 select() 调用后都会关闭与 db 的连接并再次打开吗?
  • 所以没有办法检索 ruturn 的行数?在 codeigniter $this->db->num_rows() 中。那么如何在 laravel 中进行手动选择查询呢??
  • 您可以在第一个 SELECT 查询中尝试不使用 SQL_CALC_FOUND_ROWS 和使用 COUNT(*) as found_rows 吗? @Shadow - 我不是 100% 确定,但打开/关闭 MySQL 连接是没有意义的。如果确实如此,该框架会很糟糕,因为如果这样做,它会像蜗牛一样慢..据我所知,在通过 Laravel 执行查询后查看 MySQL 的 show processlist - 进程 ID 不会改变。每个新连接都有一个不同的 id,因此它表明它不是在每个 select 或请求上关闭/打开。
  • @N.B.我不知道 laravel,但行为将与这种方法一致。顺便说一句,为 mysql 打开和关闭数据库连接并不像 oracle 那样昂贵。这只是代表我的猜测,我会检查一下。
  • 使用 COUNT(*) 并运行类似的两个查询是我认为它的性能很差。我的意思是我必须检索所有记录才能获得计数。然后使用 LIMIT 再次运行第二个查询。我想避免它。这就是我考虑 SQL_CALC_FOUND_ROWS 的原因。 @NB

标签: php mysql laravel laravel-5.2


【解决方案1】:

你现在可以尝试更新你的 Laravel。因为您的代码在 Laravel 5.5 及更高版本中运行。

您还可以使用模型查询来获取 FOUND_ROWS。例如:

$rows = User::query()
    ->select([
        DB::raw("SQL_CALC_FOUND_ROWS id")
    ])
    ->where("active", 1)
    ->limit(10)
    ->get();

$count = DB::select("SELECT FOUND_ROWS() as `row_count`")[0]->row_count;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 2017-04-06
    • 1970-01-01
    • 2017-03-10
    • 2017-07-11
    • 2018-05-04
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多