如何将原始mysql转换为laravel

时间:2015-04-13 20:30:11

标签: mysql laravel-4

我需要你的帮助。 我试图将这个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 
) )

2 个答案:

答案 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_practicesetpracticeset_id,这是a)令人困惑,b)id_practiceset将无法自动解决。你当然可以在你的关系中设置外键,但实际上它是不必要的。