小编Roh*_*aei的帖子

laravel 使用 select case 和参数绑定时分页

Laravel 版本:5.5

PHP版本:7

你好,我想执行这个查询:

select (case 
   when(title like 'my-keyword') then 1
   when(description like 'my-keyword') then 2
   ) as ordering from products where id > 10;
Run Code Online (Sandbox Code Playgroud)

当我通过查询生成器执行此操作时:

$products = DB::table('products')->select(DB::raw('(case 
   when(title like "?") then 1
   when(description like "?") then 2
   ) as ordering'))->where('id', '>', 10)->setBindings(['my-keyword', 'my-keyword'])->paginage(10);
Run Code Online (Sandbox Code Playgroud)

这将获得计数,正如我们所知,这将删除所有选择部分并将其替换为 count(*) 作为聚合,因此如果我在此查询生成器上使用 setBindings 并传递 ['my-keyword', 'my-keyword']此聚合查询将更改为:

select count(*) as aggregate from products where id > my-keyword;
Run Code Online (Sandbox Code Playgroud)

因此,这将导致在此查询和其他类似查询的替代方案上使用分页的问题!

为了解决这个问题,我更改了/..../Query/Builder.php中的一些代码:

$total = $this->getCountForPagination($columns);
Run Code Online (Sandbox Code Playgroud)

对此:

$all = $this->get();
$total = $all->count();
Run Code Online (Sandbox Code Playgroud)

对于这种情况,我知道这是错误的,但现在它有效!

我该怎么做才能以正确的方式解决这个问题?

php laravel laravel-pagination laravel-query-builder

5
推荐指数
1
解决办法
719
查看次数

mysql 分区错误主键必须包含表分区函数中的所有列

在 MySQL 8 上我有这个表:

CREATE TABLE `float_values` (
  `id` bigint UNSIGNED NOT NULL,
  `attribute_id` bigint UNSIGNED NOT NULL,
  `value` double(8,2) NOT NULL,
  `created_at` date NOT NULL,
  `updated_at` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE `float_values`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `float_values_created_at_unique` (`created_at`);

ALTER TABLE `float_values`
  MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

使用这个架构:

Schema::create('float_values', function (Blueprint $table) {
            $table->bigIncrements('id');

            $table->unsignedBigInteger('attribute_id');
            $table->float('value');

            $table->date('created_at');
            $table->date('updated_at');
        });
Run Code Online (Sandbox Code Playgroud)

创建表后,我对created_at列进行了分区:

ALTER TABLE float_values 
PARTITION BY HASH( YEAR(created_at) )
PARTITIONS …
Run Code Online (Sandbox Code Playgroud)

mysql partitioning laravel

5
推荐指数
1
解决办法
5894
查看次数

如何为经过身份验证的用户和未经身份验证的用户设置路由

我有 auth:api 中间件的问题!当我为非身份验证用户定义这样的路由时,我们有一个请求可供身份验证用户和非身份验证用户访问:

Route::post('{user}/leads', 'UsersController@getContact');
Run Code Online (Sandbox Code Playgroud)

当来宾用户请求此路线时,一切正常。是,我可以访问用户$request->user();

但是如果使用承载头传递令牌并获取用户$request->user()当然它不起作用!因为我们没有auth:api在这条路线上使用,如果我们这样做了,我们将无法与来宾用户一起访问这条路线!所以我找不到一种方法,我们为两个经过身份验证的用户定义一条路由,如果用户经过身份验证,我们就会得到$request->user()并且没有经过身份验证的用户也可以访问该路由!

提前致谢。

middleware routes oauth laravel laravel-passport

2
推荐指数
1
解决办法
1838
查看次数