php - Laravel Eloquent 选择查询返回空数组的位置
问题描述
现在,我正在使用 Laravel Eloquent 从特定包中检索购买;据说,这一行:
$customer_words_per_pack = $customer_words->where('note', 'like', $pack_title);
应该在数组中返回查询结果对象,而不是返回一个空数组。不过,我可以使用以下查询检索所有包装清单:
$models = \App\Models\WordPack::groupBy('description')->get();
当我创建一个查询来检索所有选定的包购买时:
$pack_title = '%'.$pack->description.'%';
确实返回一个字符串,但是当我将$pack->description
它放在查询中时,它不会返回任何内容。
我的目标是从这个包中检索所有购买。使用 Laravel Eloquent 不返回结果的最可能原因是什么?
控制器
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class WebGetSalesReportsController extends BaseController
{
//
public function handle(Request $request)
{
$models = \App\Models\WordPack::groupBy('description')->get();
$viewData = [ 'title' => 'Quick-E - Sales Reports',
'packs' => $models ];
return view($this->getViewGroup() . 'sales_reports', $viewData);
}
public function generate(Request $request){
$dateFrom = $request->input('date-from');
$dateTo = $request->input('date-to');
$pack_selected = $request->input('packs');
$str_selected = '%'.$pack_selected.'%';
$request->session()->flash('date-from', $dateFrom);
$request->session()->flash('date-to', $dateTo);
$request->session()->flash('packs', $pack_selected);
$action = $request->input('action', 'Go');
$models = \App\Models\WordPack::groupBy('description')->get();
$price = \App\Models\WordPack::where('description', $pack_selected)->get();
$customer_words = \App\Models\CustomerWord::select('customer_emails.first_name', 'customer_emails.last_name', 'words', 'customer_words.created_at', 'note')
->join('customer_emails', 'customer_words.customer_id', '=', 'customer_emails.customer_id')
->whereNotNull('verified_at');
//var_dump($customer_words);
if(strlen($dateFrom) == 0 && strlen($dateTo) == 0){
if($pack_selected == 'all_packs'){
$customer_words = $customer_words->get();
}
else{
$customer_words = $customer_words->where('note', 'like', $str_selected)
->get();
}
}
else if(strlen($dateFrom) != 0 && strlen($dateTo) != 0){
if($pack_selected == 'all_packs'){
$customer_words = $customer_words->whereBetween('customer_words.created_at', [ $dateFrom , $dateTo ])
->get();
}
else{
$customer_words = $customer_words->where('note', 'like', $str_selected)
->whereBetween('customer_words.created_at', [ $dateFrom , $dateTo ])
->get();
}
}
if($action === 'CSV')
return $this->makeCsv($dateFrom, $dateTo, $pack_selected, $models, $customer_words);
$viewData = [ 'title' => 'Quick-E - Sales Reports',
'packs' => $models,
'dateFrom' => $dateFrom,
'dateTo' => $dateTo,
'pack_selected' => $pack_selected,
'customer_words' => $customer_words ];
return view($this->getViewGroup() . 'sales_reports_results', $viewData);
}
private function makeCsv($dateFrom, $dateTo, $pack_selected, $models, $customer_words)
{
$newLine = "\r\n";
$result = ob_start();
if($result !== true)
die('error generating report');
/*if by pack*/
if($pack_selected != 'all_packs'){
echo '"Date"';
echo ',';
echo '"' . date("M d, Y", strtotime($dateFrom)) ." to ". date("M d, Y", strtotime($dateTo)) . '"';
echo $newLine;
echo '"Pack"';
echo ',';
echo '"' . $pack_selected . '"';
echo $newLine;
echo '"No. of Packs Purchased"';
echo ',';
echo '"' . $customer_words->count() . '"';
echo $newLine;
echo '"Total Sales"';
echo ',';
$price_total = 0;
foreach($customer_words as $customer_word){
$json_note = json_decode($customer_word->note, true);
$price_total += $json_note['price'];
}
echo '"$' . round($price_total, 2) . '"';
echo $newLine;
echo $newLine;
echo $newLine;
echo '"Date Purchased"';
echo ',';
echo '"Word Pack"';
echo ',';
echo '"Words"';
echo ',';
echo '"Price"';
echo ',';
echo '"Customer"';
echo ',';
echo $newLine;
foreach($customer_words as $customer_word){
$json_note = json_decode($customer_word->note, true);
echo '"'.date("M d, Y g:i:s A", strtotime($customer_word->created_at)).'"';
echo ',';
echo '"'.$pack_selected.'"';
echo ',';
echo '"'.$customer_word->words.'"';
echo ',';
echo '"$'.round($json_note['price'], 2).'"';
echo ',';
echo '"'.$customer_word->first_name.' '.$customer_word->last_name.'"';
echo ',';
echo $newLine;
}
echo $newLine;
echo $newLine;
}
/*all packs*/
if($pack_selected != 'all_packs'){
foreach($models as $pack){
var_dump($pack->description);
$pack_title = '%'.$pack->description.'%';
$customer_words_per_pack = $customer_words->where('note', 'like', $pack_title);
if($customer_words_per_pack->count() > 0){
echo '"Date"';
echo ',';
echo '"' . date("M d, Y", strtotime($dateFrom)) ." to ". date("M d, Y", strtotime($dateTo)) . '"';
echo $newLine;
echo '"Pack"';
echo ',';
echo '"' . $pack->description . '"';
echo $newLine;
echo '"No. of Packs Purchased"';
echo ',';
echo '"' . $customer_words_per_pack->count() . '"';
echo $newLine;
echo '"Total Sales"';
echo ',';
$price_total = 0;
foreach($customer_words_per_pack as $customer_word){
$json_note = json_decode($customer_word->note, true);
$price_total += $json_note['price'];
}
echo '"$' . round($price_total, 2) . '"';
echo $newLine;
echo $newLine;
echo $newLine;
echo '"Date Purchased"';
echo ',';
echo '"Word Pack"';
echo ',';
echo '"Words"';
echo ',';
echo '"Price"';
echo ',';
echo '"Customer"';
echo ',';
echo $newLine;
foreach($customer_words_per_pack as $customer_word){
$json_note = json_decode($customer_word->note, true);
echo '"'.date("M d, Y g:i:s A", strtotime($customer_word->created_at)).'"';
echo ',';
echo '"'.$pack_selected.'"';
echo ',';
echo '"'.$customer_word->words.'"';
echo ',';
echo '"$'.round($json_note['price'], 2).'"';
echo ',';
echo '"'.$customer_word->first_name.' '.$customer_word->last_name.'"';
echo ',';
echo $newLine;
}
echo $newLine;
echo $newLine;
}
}
}
$csv = ob_get_contents();
$result = ob_end_clean();
if($result !== true)
die('error finalizing report');
$filename = tempnam("/tmp", str_random(5) . '.sales.report');
file_put_contents($filename, $csv);
$headers = array(
'Content-Type' => 'text/csv',
);
$pack_name = $pack_selected;
if($pack_selected == 'all_packs')
$pack_name = 'All Packs';
$docName = "sales_".date("m-d-Y_h-i-s-A")."[".$pack_name."].csv";
return \Response::download($filename, $docName, $headers);
}
}
看法
@foreach($packs as $pack)
<?php
$pack_title = '%'.$pack->description.'%';
$customer_words_per_pack = $customer_words->where('note', 'like', $pack_title);
echo $customer_words_per_pack;
?>
@if($customer_words_per_pack->count() > 0)
<div class="box-top-info">
<p class="top-info">Date: <?php echo date("M d, Y", strtotime($dateFrom)) ." to ". date("M d, Y", strtotime($dateTo)); ?></p>
<p class="top-info">Pack: {{ $pack->description }}</p>
<p class="top-info">No. of Packs Purchased: {{ $customer_words_per_pack->count() }}</p>
<p class="top-info">Total Sales: $<?php
$price_total = 0;
foreach($customer_words_per_pack as $customer_word){
$json_note = json_decode($customer_word->note, true);
$price_total += $json_note['price'];
}
echo round($price_total, 2);
?>
</p>
</div>
<br>
<div id="responsive-table">
<div class="row tbl-wrapper">
<div class="col s12 outer-tbl">
<table class="striped" id="sorting">
<thead>
<tr>
<th>Date Purchased</th>
<th>Word Pack </th>
<th>Words </th>
<th>Price </th>
<th>Customer </th>
</tr>
</thead>
<tbody class="striped">
@foreach($customer_words_per_pack as $customer_word)
<?php $json_note = json_decode($customer_word->note, true); ?>
<tr>
<td><?php echo date("M d, Y g:i:s A", strtotime($customer_word->created_at)); ?></td>
<td>{{ $pack_selected }}</td>
<td>{{ $customer_word->words }}</td>
<td><?php echo '$'.round($json_note['price'], 2); ?></td>
<td>{{ $customer_word->first_name }} {{ $customer_word->last_name }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
<hr class="split">
@endif
@endforeach
解决方案
您可以使用双引号,
$pack_title = $pack->description; // changed this
$customer_words_per_pack = $customer_words->where('note', 'like', "%$pack_title%");
它应该工作
编辑
use App\Models\WordPack;
use App\Models\CustomerWord; // make sure they are in Models folder.
您必须按以下方式再次创建 customer_words
$customer_words = CustomerWord::select('customer_emails.first_name', 'customer_emails.last_name', 'words', 'customer_words.created_at', 'note')
->join('customer_emails', 'customer_words.customer_id', '=', 'customer_emails.customer_id')
->whereNotNull('verified_at');
$pack_title = $pack->description; // changed this
$customer_words_per_pack = $customer_words->where('note', 'like', "%$pack_title%")->get(); // append get() to close the query
它应该工作。
注意:一旦你在最后写了 get(),Eloquent 就会关闭查询。
推荐阅读
- python - 如何将字典作为 PCollection 返回?
- r - 如何通过数字排序中心重命名 kmeans 集群
- php - 与用户 php 链接数据
- excel - 替换Excel VBA中文本框的2个字符串
- r - R 中的错误:Foreach 函数:“plot.new 尚未被调用”
- java - GlassFish 4.1.2 中带有 Jersey 2.2 的“HTTP 403 禁止”
- java - 错误:
与属性不兼容 : (attr) 参考 [弱] - hadoop - MapReduce 输入输出选择性
- javascript - 下拉菜单和内容按国家/地区更改
- java - 在 C 中执行命令行命令并与之交互