【问题标题】:laravel 5.1 eloquent querylaravel 5.1 雄辩的查询
【发布时间】:2015-09-26 21:48:09
【问题描述】:

我有一个在 PMA 中运行良好的查询,我正在尝试将其转换为 Eloquent,但我一定遗漏了一些东西。 这里是 SQL 查询:

SELECT t1.* FROM ppr__child_absence t1 
LEFT JOIN ppr__children t3 ON t3.idcode=t1.child_idcode 
WHERE t1.id = (SELECT t2.id FROM ppr__child_absence t2 
    WHERE t2.child_idcode = t1.child_idcode 
    ORDER BY t2.id DESC LIMIT 1) 
AND t3.deleted_at IS NULL 
AND $input BETWEEN start AND stop;

他是我雄辩的疑问:

$input = Request::all();
$pprs =
    DB::table('ppr__child_absence')
    ->join('ppr__children', function($join) {
        $join->on('ppr__children.idcode', '=', 'ppr_children_absence.child_idcode')
            ->where('ppr__child_absence.child_idcode', '=', DB::raw('SELECT t2.id FROM ppr__child_absence t2
              WHERE t2.child_idcode = ppr__child_absence.child_idcode
              ORDER BY t2.id DESC LIMIT 1'));})
            ->whereNull('ppr__children.deleted_at')
            ->whereBetween($input, array('ppr_children_absence.start','ppr_children_absence.stop'))->get();

我不断收到错误: Grammar.php 第 58 行中的 ErrorException: strtolower() 期望参数 1 是字符串,给定数组。

这里有人能引导我走向正确的方向吗? 基本上用户有 1 个日期输入,带有日期选择器和提交按钮,以根据选择的日期获取结果。

在此处进行查询,没有错误但没有结果

$input = Request::all();
    $pprs = DB::table('ppr__child_absence')
            ->select('ppr__child_absence.*')
            ->join('ppr__children', function($join) {
            $join->on('ppr__children.idcode', '=', 'ppr__child_absence.child_idcode')
                ->where('ppr__child_absence.id', '=', DB::raw('SELECT t2.id FROM ppr__child_absence t2
                  WHERE t2.child_idcode = ppr__child_absence.child_idcode
                  ORDER BY t2.id DESC LIMIT 1'));})
                ->whereNull('ppr__children.deleted_at')
                ->where('ppr__child_absence.start', '<', $input['ppr_day'])
                ->where('ppr__child_absence.stop', '>', $input['ppr_day'])->get();

【问题讨论】:

    标签: php mysql laravel eloquent


    【解决方案1】:

    $input = Request::all(); 将所有输入字段存储在一个数组中。

    您正在使用-&gt;whereBetween($input,...)whereBetween() 的第一个参数应该是一个字符串(表列的名称),但您传递的是一个数组。

    您没有提供有关输入的详细信息。假设输入包含一个名为“字段”的字段,您应该改用-&gt;whereBetween($input['field'],...)

    【讨论】:

    • 谢谢!我确实错过了,但还有别的东西。我收到错误 SQLSTATE[42S22]: Column not found: 1054 Unknown column '2015-09-26' in 'where 子句'。它试图找到一个列并且不承认它是一个日期。即使它在模型文件中声明。 $input 字段字段名称将是 'ppr_day' 。
    • 还在 DB::table('ppr__child_absence') 之后添加了一行 ->select('ppr__child_absence.*')
    【解决方案2】:

    您似乎想要的不是whereBetween 方法提供的。使用whereBetween 时,逻辑是您希望给定列值介于两个输入值之间。 Laravel Query Builder Documentation中的例子选的好:

    // the column 'votes' value should be between 1 and 100
    $users = DB::table('users')->whereBetween('votes', [1, 100]);
    

    您似乎想要的是确保输入值介于两个不同的列值之间。你可以通过两个不同的条件来做到这一点:

    ->where('ppr_children_absence.start', '<', $input['value'])
    ->where('ppr_children_absence.stop', '>', $input['value'])
    

    这将确保$input['value']) 介于startstop 列值之间。

    【讨论】:

    • 谢谢!那个 + 小错字修复成功了。我看起来可以工作,没有错误,但即使我在数据库中有一些数据,结果也是 0。
    • 查询转储给了我这个` "SELECT ppr__child_absence.* from ppr__child_absence inner join ppr__children on ppr__children.idcode = ppr__child_absence.child_idcodeppr__child_absence " ` 看起来原始查询没有执行还是什么?为什么 ”?” ?
    • 尝试使用whereRaw而不是where,就像-&gt;whereRaw('t1.id = (SELECT t2.id FROM ppr__child_absence t2 WHERE t2.child_idcode = t1.child_idcode ORDER BY t2.id DESC LIMIT 1)')一样。
    • 看起来很有希望,但给出了一个错误Call to undefined method Illuminate\Database\Query\JoinClause::whereRaw() 我什至尝试通过将其更改为 = DB::table('ppr__child_absence AS t2') -&gt;select('t2.id') -&gt;where('t2.child_idcode', '=', 't1.child_idcode') -&gt;orderBy('t2.id', 'desc') -&gt;limit(1) -&gt;get() 来删除原始数据,但不幸的是没有运气!
    猜你喜欢
    • 1970-01-01
    • 2018-01-26
    • 2021-07-23
    • 1970-01-01
    • 2017-11-11
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多