我需要你的帮助。 我试图将这个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] => test@gmail.com
[name] => Test name
[created_at] => 2015-04-08 17:12:31
[state] => 0
[link] => 25
) )
答案 0 :(得分:0)
使用laravel,最好使用其即用型关系。它会自动创建所需的连接。 请查看此部分文档Querying Relations。
答案 1 :(得分:0)
首先,我对数据表的体验是你不应该使用->get()
,你应该将QueryBuilder
对象而不是Collection
传递给它。
其次,您的FROM子句与订单的比较与'normal'
有什么不同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()
替换with(eager loading)并自己动手。
有一件事,如果您希望Laravel(和Eloquent)为您提供更多便利,请在创建表和字段时遵循命名约定。您同时使用id_practiceset
和practiceset_id
,这是a)令人困惑,b)id_practiceset
将无法自动解决。你当然可以在你的关系中设置外键,但实际上它是不必要的。