这更多是一个理论问题。像雄辩一样,如何在原始laravel查询中使用条件?对于简单的查询,这不是问题,因为您可以雄辩地编写查询,但是对于更复杂的查询,这将是一个不错的功能(我不确定是否存在)。
这是一个非常简单的示例。雄辩的版本有效,但原始版本无效。如果要使用原始查询完成此操作,您将如何做?
雄辩...
$query = Transaction::orderBy('processingTime', 'desc');
if(isset($request->search['status'])) {
$query->where('status', '=', $request->search['status']);
}
$query->get();
原始...
$query = DB::select('SELECT * FROM transactions ORDER BY processingTime DESC');
if(isset($request->search['status'])) {
$query->where('status', '=', $request->search['status']);
}
$query->get();
我问这个问题的原因是因为我昨天面对一个复杂的查询并设法使用集合解决了这个问题,但我不禁想到有一种更简便,更有效的方法。这就是我昨晚解决问题的方法。
$report = collect(DB::connection('mysql2')->select("SELECT
t2.holder,
t2.merchantTransactionId,
t2.bin,
t2.last4Digits,
t3.expDate,
(CASE WHEN t3.expDate < CURDATE() THEN 'Expired'
WHEN t3.expDate > CURDATE() THEN 'Due to expire' END) AS expInfo,
t2.uuid
FROM transactions AS t2
INNER JOIN (
SELECT t1.uuid, t1.holder, t1.bin, t1.last4Digits, LAST_DAY(CONCAT(t1.expiryYear, t1.expiryMonth, '01')) AS expDate
FROM transactions t1
JOIN (SELECT t1.merchant_access
FROM total_control.users,
JSON_TABLE(merchant_access, '$[*]' COLUMNS (
merchant_access VARCHAR(32) PATH '$')
) t1
WHERE users.id = :userId
) AS t2
ON t1.merchantUuid = t2.merchant_access
WHERE t1.paymentType = 'RG'
AND t1.status = 1
) t3
ON t2.uuid = t3.uuid
WHERE t3.expDate BETWEEN DATE_SUB(CURDATE(), INTERVAL 30 DAY) AND DATE_ADD(CURDATE(), INTERVAL 30 DAY)
GROUP BY t2.holder, t2.bin, t2.last4Digits
ORDER BY t2.holder ASC", ['userId' => $request->userId]));
if(isset($request->search['holder'])) {
$filtered = $report->filter(function($value, $key) use ($request) {
if(strpos(strtolower($value->holder), strtolower($request->search['holder'])) !== false) {
return $value;
}
});
return $filtered->all();
}
答案 0 :(得分:0)
有关更多详细信息,请参阅文档query builder
您还可以使用原始表达式来创建复杂条件。 Raw Expressions
$query = Transaction::orderBy('processingTime', 'desc');
if(isset($request->search['status'])) {
$query->where(DB::raw("status= $request->search['status']"));
}
$query->get();
从下面的查询中可以看到,我已经在其中一个查询中使用了它。
$query->where(DB::raw("str_to_date(supplier_bookings.created_at, '%Y-%m-%d')"), [$from, $to]);
注意:原始语句将作为字符串注入到查询中,因此您应格外小心,不要创建SQL注入漏洞。
此外,您还可以使用 whereRaw 方法
$query = Transaction::orderBy('processingTime', 'desc');
if(isset($request->search['status'])) {
$query->whereRaw("status= $request->search['status']");
}
$query->get();
答案 1 :(得分:0)
执行DB::select()
时,它将直接运行查询,请改用DB::table()
实例化查询生成器。
$query = DB::table('transactions')->orderBy('processingTime', 'desc');
if(isset($request->search['status'])) {
$query->where('status', '=', $request->search['status']);
}
$query->get();
答案 2 :(得分:0)
我在项目中遇到过类似情况。我只是开始一个查询字符串,然后在进行查询时通过简单的连接向其添加条件,并在最后完全运行该查询。
不确定复杂的查询是否可行,但对于简单的示例,您可以遵循相同的方法(遵循样式):
.event_types a:before {
content: ' | ';
}
当然,您需要根据需要发挥创造力。例如,如果您需要使用AND在多个位置进行操作,则可以执行以下操作:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="element1">
<dd class="event_types">
<a>Campaigns</a>
<a>Other</a>
<a>Clubs</a>
</dd>
</div>
<div class="element2">
<dd class="event_types">
<a>Club</a>
<a>Sport</a>
<a>Campaigns</a>
</dd>
</div>
我希望对您有帮助