我已经将一个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给我错误?
答案 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的旅程!