我对雄辩有一个奇怪的问题,我试图做到以下几点:
$this->node = \DB::table('permission')
->select('permission.id',
'object.name as object_name',
'permission.created_at',
'object.id as object_id')
->join('object', 'object.id', '=', 'permission.object_id')
->join('action', 'action.id', '=', 'permission.action_id')
->where('permission.person_id', $this->person['id'])
->groupBy('permission.object_id')
->orderBy('permission.created_at', 'desc')
->paginate(5);
Laravel Framework报告一个错误:
Connection.php第761行中的QueryException:SQLSTATE[42000]:语法错误或访问冲突:1055“permission.id”不在GROUP BY中(SQL:选择permission
id
,object
作为object\u name
,permission
在
创建,
对象作为
object\u id
来自permission
对象的内部连接
对象
在
排序人对象
=1个分组人上
对象id
内部连接操作
关于操作
权限
操作id
其中权限
人员id权限
对象id权限
创建于描述限制5偏移0)
我添加了一个雄辩的调试函数DB::在AppServiceProvider中监听:
use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
DB::listen(function ($query) {
echo "<pre>";
print_r($query->sql);
echo "</pre>";
// $query->sql
// $query->bindings
// $query->time
});
}
...
它会打印此SQL查询:
select `permission`.`id`,
`object`.`name` as `object_name`,
`permission`.`created_at`,
`object`.`id` as `object_id`
from `permission`
inner join `object` on `object`.`id` = `permission`.`object_id`
inner join `action` on `action`.`id` = `permission`.`action_id`
where `permission`.`person_id` = 1
group by `permission`.`object_id`
order by `permission`.`created_at` desc
limit 5 offset 0
任何想法?
谢谢
此查询违反sql标准,并且仅在某些sql模式设置下在mysql中有效。见mysql留档MySQL处理的GROUP BY:
SQL92和更早版本不允许select list、HAVING condition或ORDER BY list引用既不在GROUP BY子句中命名也不在功能上依赖于GROUP BY列(由GROUP BY列唯一确定)的未聚合列的查询。例如,此查询在标准SQL92中是非法的,因为“选择”列表中的“未聚合名称”列未显示在“分组依据”中:
选择o.custid、c.name、订单中的最大(o.payment)作为o,客户作为c,其中o.custid=c.custid按o.custid分组;要使查询在SQL92中合法,必须从select列表中省略name列或在GROUP BY子句中命名。
SQL99和更高版本允许每个可选功能T301使用这样的非聚合,如果它们在功能上依赖于GROUP BY列:如果名称和查询之间存在这样的关系,则查询是合法的。例如,这将是客户的主键。
SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
Laravel5.3也面临着同样的问题,他们试图强制执行mysql-5.7附带的严格的查询编写
然而,要禁用这只是去配置/database.php
和更改严格
标志
'mysql' => [
.
.
.
'strict' => false,
//'strict' => true,
.
.
],
希望这也能解决你的问题。
PS-有关严格查询写作的详细信息,请参阅@Shaow的答案
Laravel Eloquent的save()方法实质上是执行查询生成器的工作吗? 查询生成器: 雄辩的: 如果这是真的,那么Eloquent的也是如此吗?我正在看Laravel的官方视频教程,我看到作者在控制器中使用了雄辩的和。这就是查询生成器和雄辩的区别吗?我们可以使用雄辩的内部控制器?
假设我们正在使用Laravel的查询生成器: 我正在寻找一个等效的SQL: 当我必须键入大量select和WHERE(或者通常在select的列alias中包含别名,并且它在结果数组中使用)时,这将特别有用。如果没有任何表别名,我需要输入更多的内容,所有内容的可读性都会降低。在laravel文档中找不到答案,有什么想法吗?
我工作太多mysql大视图。我不想使用雄辩模型的意见。 我创建了“ViewBalance\Support\Facades\DB”。一切都如我所愿。 但我需要为公司范围设置init()方法。 如果没有init()方法,如何使用全局作用域? 视图模型 控制器
我有下面的模式, 学生(名字、姓氏、SID) 已注册(学生ID、课程ID) 课程(CID、课程名称、系) 我需要找出哪些学生上的课比课多。和位位于类别中。我有以下查询,其中列出了所有注册课程的学生以及他们注册了多少课程。 不太确定如何将这个数字与那些注册信息技术课程的人进行比较。
我有两个模型。模型有一个(关系)。 关于模型,我有以下关系:
我使用laravel雄辩到CRUD数据。我的问题是,我不知道如何使用laravel雄辩的ORM进行UNION查询。你能帮我解决我的问题吗 这是我想要在laravel雄辩或查询生成器中实现的示例查询