Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5.1雄辩的查询生成器分页使用原始SQL_Php_Mysql_Laravel 5_Pagination_Laravel Paginate - Fatal编程技术网

Php Laravel 5.1雄辩的查询生成器分页使用原始SQL

Php Laravel 5.1雄辩的查询生成器分页使用原始SQL,php,mysql,laravel-5,pagination,laravel-paginate,Php,Mysql,Laravel 5,Pagination,Laravel Paginate,我正试图解决Laravel5.1EloquentBuilder的一个问题,当查询生成器包含原始选择时,分页会破坏SQL 背景 我正在构建一个web应用程序,用户可以在其中查询配置文件列表。前端有一个过滤UI。过滤用户界面有一个选项,用于“包含一个或多个图像”,“包含一个或多个视频” MySQL数据库有一个用于配置文件的表,以及一个用于媒体项(图像、视频等)的单独表。媒体表有一个配置文件ID列(所有者)和一个媒体类型列(表示图像、视频等) 因此,我试图计算与配置文件id匹配的媒体项的数量,然后计算

我正试图解决Laravel5.1EloquentBuilder的一个问题,当查询生成器包含原始选择时,分页会破坏SQL

背景 我正在构建一个web应用程序,用户可以在其中查询配置文件列表。前端有一个过滤UI。过滤用户界面有一个选项,用于“包含一个或多个图像”“包含一个或多个视频”

MySQL数据库有一个用于配置文件的表,以及一个用于媒体项(图像、视频等)的单独表。媒体表有一个配置文件ID列(所有者)和一个媒体类型列(表示图像、视频等)

因此,我试图计算与配置文件id匹配的媒体项的数量,然后计算计数是否大于1

在配置文件表上的语句中也有其他简单的过滤选项(但这些选项工作正常)-例如性别、dob等

我已将以下方法添加到我的laravel剖面模型中:

public function scopeMediaCounts($query, $media_type, $count = null, $operator = '=') 
{
    $media_types = array();

    switch ($media_type) {
        case 'images':
            $media_types[] = 1;
            break;
        case 'videos':
            $media_types[] = 2;
            $media_types[] = 3;
            break;
    }

    // $query to build

}
我打算这样使用:
->mediaccounts('images',1'>')->mediaccounts('videos',1'>')


我试过的 我尝试了各种基于laravel文档、堆栈溢出答案、谷歌搜索和试错的组合。然而,我能得到的最接近的结果如下:

public function scopeMediaCounts($query, $media_type, $count = null, $operator = '=') 
{
    $media_types = array();

    switch ($media_type) {
        case 'images':
            $media_types[] = 1;
            break;
        case 'videos':
            $media_types[] = 2;
            $media_types[] = 3;
            break;
    }

    $types = implode(',', $media_types);
    $query->leftJoin('media', 'profiles.profile_id', '=', 'media.profile_id')
        ->selectRaw("profiles.*, count(media.profile_id) as {$media_type}Count")
          ->whereIn('media.type', $media_types)
      ->groupBy('profiles.profile_id');

    if (is_int($count))
        $query->having("{$media_type}Count", $operator, $count);

    return $query;
}
当尝试使用
->mediaCounts()
多次使用时,上述代码会中断

哎呀,好像出了什么事

2/2
QueryException in Connection.php line 662:
SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'media' (SQL: select profiles.*, count(media.profile_id) as imagesCount, profiles.*, count(media.profile_id) as videosCount from `profiles` left join `media` on `profiles`.`profile_id` = `media`.`profile_id` left join `media` on `profiles`.`profile_id` = `media`.`profile_id` where `media`.`type` in (1) and `media`.`type` in (2, 3) group by `profiles`.`profile_id`, `profiles`.`profile_id` having `imagesCount` >= 1 and `videosCount` >= 1)

上面的示例不考虑介质类型,但在将其传递到paginate函数之前“起作用”

错误:
->mediaccounts('images',1'>')->mediaccounts('videos',1'>')->paginate(20)

但是,如果我在SQL到达分页之前转储它,SQL查询在MySQL Workbench中可以正常工作(减去它不选择媒体类型):

真的不知道如何解决断页问题。其他堆栈溢出问题指示手动创建分页,但是示例是laravel 4,使用5.1中似乎不存在的方法

请帮忙


谢谢,Zac

在同一个查询中使用mediaccounts()两次时出现错误是正常的,因为它会两次进行相同的连接,所以请重新编写查询或在单独的查询中调用作用域。如果您需要在5.1中进行手动分页的帮助,请告诉我。在同一查询中使用mediaCounts()两次时出现错误是正常的,因为它两次进行相同的联接,因此请重新编写查询或在单独的查询中调用作用域。如果您需要在5.1中手动分页的帮助,请告诉我。
public function scopeMediaCounts($query, $media_type, $count = null, $operator = '=') 
{
    $media_types = array();

    switch ($media_type) {
        case 'images':
            $media_types[] = 1;
            break;
        case 'videos':
            $media_types[] = 2;
            $media_types[] = 3;
            break;
    }

    $types = implode(',', $media_types);

    $query
        ->selectRaw("{$this->table}.*, ( SELECT  COUNT(*)
            FROM    ver3_data_media           media
            WHERE   media.profile_id      = {$this->table}.profile_id
            )   AS      \"{$media_type}Count\"")
        ->having("{$media_type}Count", $operator, $count);

    return $query;
}
QueryException in Connection.php line 662:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'imagesCount' in 'having clause' (SQL: select count(*) as aggregate from `profiles` having `imagesCount` >= 1 and `videosCount` >= 1)
select profiles.*, ( SELECT  COUNT(*)
            FROM    media           media
            WHERE   media.profile_id      = profiles.profile_id
    )       AS      imagesCount, profiles.*, ( SELECT  COUNT(*)
            FROM    media           media
            WHERE   media.profile_id      = profiles.profile_id
    )       AS      videosCount from `profiles` group by `profiles`.`profile_id`, `profiles`.`profile_id` having `imagesCount` >= 1 and `videosCount` >= 1