我需要你的帮助。我试图将这个mysql转换为laravel,但是我将得到“无法在非对象上调用xy函数”的信息。
这是mysql查询,它在mysql上运行,没有任何错误:
select k.id, users.email, problemsets.name, k.created_at, k.state as state, k.id as link
FROM ( SELECT * FROM `user_practicesets` AS b ORDER BY b.id DESC ) AS k
left join `users` on `users`.`id` = k.`id_user`
left join `practicesets` on `practicesets`.`id` = k.`id_practiceset`
left join `problemsets` on `problemsets`.`practiceset_id` = `practicesets`.`id`
GROUP BY k.id_user, k.id_practiceset
order by k.`id_practiceset`
这是我的转变:
$items = DB::select(
DB::raw('select k.id, users.email, problemsets.name, k.created_at, k.state as state, k.id as link '.
'FROM ( SELECT * FROM `user_practicesets` AS b ORDER BY b.id DESC ) AS k '.
'left join `users` on `users`.`id` = k.`id_user` '.
'left join `practicesets` on `practicesets`.`id` = k.`id_practiceset` '.
'left join `problemsets` on `problemsets`.`practiceset_id` = `practicesets`.`id` '.
'GROUP BY k.id_user, k.id_practiceset '.
'order by k.`id_practiceset`'
))->get();
return Datatables::of($items)
->edit_column('state', '{{ $state == 1 ? "<span class=\"text-success glyphicon glyphicon-ok\"></span>" : "<span class=\" text-danger glyphicon glyphicon-remove\"></span>" }}')
->edit_column('link', '<button data-id="{{$id}}" type="button" class="view-up btn btn-sm btn-primary">Megtekint</button>')
->make();
不幸的是我没有任何想法。
将$items
具有以下数据:
Array (
[0] => stdClass Object (
[id] => 25
[email] => [email protected]
[name] => Test name
[created_at] => 2015-04-08 17:12:31
[state] => 0
[link] => 25
) )
首先,我对数据表的经验是,您不应使用->get()
,而应该将QueryBuilder
对象传递给,而不是Collection
。
其次,与“正常”相比,您的FROM子句与订单的区别是什么
FROM `user_practicesets`
?
如果您想要最高的ID,只需在选择中使用max(id),我想它将使您的生活更轻松。不确定您的期望是什么,因此您可能应该在这里和那里进行调整。
没关系,您可能最终想要得到类似(未经测试)的内容:
$items = DB::table('user_practicesets')::with('users')
->with('practiceSets')
->with('problemSets')
->select(
DB::raw('MAX(user_practicesets.id) as link'),
'users.email',
'problemsets.name',
'user_practicesets.created_at',
'user_practicesets.state'
)
->groupBy('user_practicesets.id_user', 'user_practicesets.id_practiceset')
->orderBy('user_practicesets.id_practiceset');
但是为此,您必须进行关系设置。您也可以自己添加联接,方法是使用(替换为)(急切加载)->leftJoin()
并自己进行。
一件事,如果您想让Laravel(和Eloquent)使事情变得容易,请在创建表和字段时遵循命名约定。您同时使用id_practiceset
和practiceset_id
,这是a)令人困惑的,而b)id_practiceset
不会自动解决。您当然可以在关系中设置外键,但这实际上是不必要的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句