Laravel中的高级条款

时间:2016-04-03 17:56:33

标签: php laravel laravel-5 eloquent

我在Laravel eloquent中遇到了我的查询问题,我在运行查询时没有得到结果,生成的查询似乎不是我所期望的。

这是控制器中的代码:

$lastUpdate = Input::get('last_update');
$userId = Auth::user()->id;

$eventIds = EventVendor::where('user_id', $userId)
                    ->where('is_active', 1)->get()->lists('event_id');

$events = EventDetails::whereIn('id', $eventIds)
                    ->where(function($query) use ($lastUpdate) {
                        $query->where('created_at', $lastUpdate);
                        $query->orWhere('updated_at', $lastUpdate);
                    })
                    ->where('is_active', 1)
                    ->with("details_sub")
                    ->with("extras")
                    ->with("chargesDiscounts")
                    ->toSql();

这是生成的查询:

select * from `mtgh_event_details` 
    where `mtgh_event_details`.`deleted_at` is null 
        and 0 = 1 
        and (`created_at` = ? or `updated_at` = ?) 
        and `is_active` = ?

除了应该在那里的0 = 1之外,我也没有看到完整的查询。

2 个答案:

答案 0 :(得分:4)

0 = 1正在显示,因为填充$eventIds的查询未返回任何结果,因此您的Collection为空。如果将空数组(或Collection)传递给whereIn(),则会通过添加0 = 1来快速查询查询,因为搜索where id in ()是无效的SQL,并在逻辑上搜索无论如何,空集总是不会返回任何结果。此快捷方式已在4.2.17中添加this pull request

至于查询的其余部分,一切看起来都很正常。 with()语句正在设置急切加载,它使用单独的SQL语句;它不使用连接。

因此,由于您有三个with()语句,您实际上将运行四个单独的查询,一个用于获取EventDetails,然后一个用于加载details_sub,{{ 1}}和extras用于加载的事件详细信息。

由于它们是单独的查询,因此它们不会显示在chargesDiscounts输出中。

其他说明:

  • 获取活动ID后,您无需拨打toSql(),只需在查询中拨打->get()->lists()即可。如果您先致电->lists(),它会将完整的对象加载到get(),然后您在Collection上调用lists()。您只需在查询本身上调用Collection即可避免首先加载完整的Collection

  • 假设您已设置关系,您可以避免初始查询以获取ID。您可以改用whereHas() method。您的查询将如下所示:

    lists()

答案 1 :(得分:1)

所以我发现了这个问题,显然这是查询的一部分

0 = 1

返回null或空列表,因此查询中为Dim i As Long Dim result As String Dim UserInput As String For i = 1 To Len(UserInput) If (Asc(Mid(UserInput, i, 1)) >= 48 And Asc(Mid(UserInput, i, 1)) <= 57) Or _ (Asc(Mid(UserInput, i, 1)) >= 65 And Asc(Mid(UserInput, i, 1)) <= 90) Or _ (Asc(Mid(UserInput, i, 1)) >= 97 And Asc(Mid(UserInput, i, 1)) <= 122) Or _ Asc(Mid(UserInput, i, 1)) = 45 Then result = result & Mid(UserInput, i, 1) Else Debug.Print "Removed invalid character " & Mid(UserInput, i, 1) & " (" & Asc(Mid(UserInput, i, 1)) & ")" End If Next i Cells(Row, 7).Formula = result 。另外,在另一个答案的帮助下,我能够简化我的代码,所以谢谢。 :)