我在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
之外,我也没有看到完整的查询。
答案 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
。另外,在另一个答案的帮助下,我能够简化我的代码,所以谢谢。 :)