Laravel 5.6中的QueryException

时间:2018-08-09 21:01:15

标签: php laravel laravel-5

我已经将一个sql转换为laravel查询,所以我在下面附带了它。

DB::table('posts')
    ->select('posts.*', DB::raw('GROUP_CONCAT(l.name ORDER BY l.id) as location_name'))
    ->join('locations as l', "posts.location_ids", "=", "l.id")
    ->whereRaw('FIND_IN_SET(l.id, posts.location_ids) > 0')
    ->where("posts.status", 'active')
    ->groupBy('posts.id')
    ->get();

但这给我一个错误。

SQLSTATE[42000]: Syntax error or access violation: 1055 'laraveltest.posts.title' isn't in GROUP BY (SQL: select `posts`.*, GROUP_CONCAT(l.name ORDER BY l.id) as location_name from `posts` inner join `locations` as `l` on `posts`.`location_ids` = `l`.`id` where FIND_IN_SET(l.id, posts.location_ids) > 0 and `posts`.`status` = active group by `posts`.`id`)

当我在任何mysql工具中运行此查询时,它返回的行没有任何失败。为什么laravel给我错误?

2 个答案:

答案 0 :(得分:1)

这是laravel / mysql中的设置,用于config / database.php中的laravel外观。 将严格模式设置为false

'connections' => [
    'mysql' => [
        'strict' => false,
    ]

Laravel没有给您错误,它实际上是在执行MYSQL规则。 PHPMYADMIN和其他工具不会强制执行此操作,因此这就是为什么您不会得到此错误的原因。

答案 1 :(得分:0)

laravel之所以如此出色,是因为您可以摆脱编写此类大型数据库查询的麻烦。

您应该抽出一些时间来认真研究并阅读laravel文档以及雄辩的工作方式。我保证,您将很快拿起它,便会感到惊讶。

现在,对于自己这样的情况,您有两个模型。

发布模型

位置模型

在您的帖子模型中,您将像这样创建关系

public function location()
{ 
    return $this->belongsTo(Location::class);
}

,然后在您的位置模型中定义这样的关系

public function post()
{ 
    return $this->hasMany(Post::class);
}

现在,在您的posts_table中,需要确保您具有location_id整数列。

现在您可以做的就是获取所需的Location实例,例如:

//This will give you the row where id = 1
$location = Location::find(1);

现在,您可以轻松地执行以下操作以访问该位置的所有帖子:

foreach($location->posts as $post){
    //Do whatever you want here $post is the object 
    echo $post->title
}

该关系反之,例如:

$post = Post::find(1);

现在,由于此帖子仅属于1个位置,因此您可以这样称呼

echo $post->location->column_name_in_location_table 

希望这可以帮助您开始学习laravel的旅程!