【问题标题】:Laravel - Error: Method Illuminate\Support\Collection::links does not existLaravel - 错误:方法 Illuminate\Support\Collection::links 不存在
【发布时间】:2019-12-06 14:42:15
【问题描述】:

我正在尝试使用 PHP 7、Laravel 5.8、Maatwebsite Excel 3.1 导出到 excel。我成功显示在视图刀片上并执行了过滤器。

型号:

use App\UserResponse;

控制器

public function userresponseReport(Request $request,$export=false)
{
    $data['title'] = 'User Response';

    $userresponses = DB::table('user_response as g')
        ->select(
            //DB::raw('DATE(g.created_at) as created_date'),
            DB::raw('g.created_at as created_date'),
            'g.msisdn', 
            'g.game_code', 
            'g.answer',
            'g.answer_code',
            'g.Amount_charged',
            'g.payment_ref',
            'g.status',
            'g.user_channel'                
        )               
        ->orderByRaw('g.created_at DESC'); 

    $start_date = $request->start_date;
    $end_date = $request->end_date; 

    $render=[];  
    if(isset($request->start_date) && isset($request->end_date))
    {
        $userresponses = $userresponses->whereBetween('created_at',[$start_date.' 00:00:00',$end_date.' 23:59:59']);
        $render['start_date'] = $request->start_date;
        $render['end_date'] = $request->end_date;
    } elseif(isset($request->start_date)) {
        $userresponses = $userresponses->where('created_at',$request->start_date);
        $render['start_date'] = $request->start_date;
    }

    if(isset($request->msisdn))
    {
        $userresponses = $userresponses->where('msisdn','like','%'.$request->msisdn.'%');
        $render['msisdn'] = $request->msisdn;
    }

    if(isset($request->game_code))
    {
        $userresponses = $userresponses->where('game_code','like','%'.$request->game_code.'%');
        $render['game_code'] = $request->game_code;
    }   

    if(isset($request->user_channel))
    {
        $userresponses = $userresponses->where('user_channel','like','%'.$request->user_channel.'%');
        $render['user_channel'] = $request->user_channel;
    }

    if(!empty($export))
    {
        return Excel::download(new UserresponseExport($userresponses->get()), 'userresponse.xlsx');
    }        
    $userresponses = $userresponses->orderBy('created_at','DESC');
    $userresponses = $userresponses->paginate(15);
    $userresponses = $userresponses->appends($render);
    $data['userresponses'] = $userresponses;

    return view('report.userresponseReport',$data);        
}

然后,视图刀片:

userresponseReport.blade.php

<div class="row" style="margin-bottom: 10px">
    {{ Form::model(request(),['method'=>'get']) }}
        <div class="col-sm-2">
             {{ Form::text('msisdn',null,['class'=>'form-control','placeholder'=>'MSISDN']) }}
        </div>
        <div class="col-sm-2">
             {{ Form::text('game_code',null,['class'=>'form-control','placeholder'=>'Game Code']) }}
        </div>   
        <div class="col-sm-2">
             {{ Form::text('user_channel',null,['class'=>'form-control','placeholder'=>'Channel']) }}
        </div>          
        <div class="col-sm-2">
            {{ Form::date('start_date',null,['class'=>'form-control','placeholder'=>'Date']) }}
        </div>
        <div class="col-sm-2">
            {{ Form::date('end_date',null,['class'=>'form-control','placeholder'=>'Date']) }}
        </div>          
        <div class="col-xs-2">
            {{ Form::submit('Search',['class'=>'btn btn-warning']) }}
            <a href="{{ route('userresponseReport',['export']) }}" class="btn btn-primary"><i class="fa fa-file-excel-o"></i> Excel</a>
        </div>
    {{ Form::close() }}
</div>


<div class="box box-primary">
        <div class="box-header with-border">
            <table class="table table-bordered table-hover table-striped table-condesed" id="commenter_info_table">
                <caption></caption>
                <thead>
                    <tr>
                        <td>#</td>
                        <td>Date</td>
                        <td>MSISDN</td>
                        <td>Game Code</td>
                        <td>Game Name</td>
                        <td>Answer</td>
                        <td>Channel</td>
                    </tr>
                </thead>
                <tbody>
                    @foreach($userresponses as $key => $userresponse)
                        <tr>
                            <td>{{ ++$key }}</td>
            <!--                <td>{{ $userresponse->created_date }}</td>-->
                            <td>{{ date('Y-m-d h:i:s A', strtotime($userresponse->created_date)) }}</td>
                            <td>{{ $userresponse->msisdn }}</td>
                            <td>{{ $userresponse->game_code }}</td>
                            <td> 
                                @if($userresponse->game_code=='101')
                                   Trivia
                                @elseif($userresponse->game_code=='102')
                                   Predict and Win 
                                @elseif($userresponse->game_code=='103')
                                   Party With the BBN 
                                @elseif($userresponse->game_code=='104')
                                   Grand Prize  
                                @elseif($userresponse->game_code=='105')
                                   Happy Hour    
                                @elseif($userresponse->game_code=='106')
                                   Power Boost                         
                                @endif                       
                            </td>                
                            <td>{{ $userresponse->answer }}</td>
                            <td>{{ $userresponse->user_channel }}</td>                                    
                        </tr>          
                    @endforeach
                        <tr>
                        <td colspan="14">
                            {{ $userresponses->links() }}
                        </td>
                        </tr>         
                </tbody>

            </table>

然后是导出

UserresponseExport

class UserresponseExport implements FromView, WithHeadings, ShouldAutoSize, WithEvents, WithMapping
{
    protected $userresponses;

    public function __construct($userresponses = null)
    {
        $this->userresponses = $userresponses;
    }

    public function view(): View
    {
        return view('report.userresponseReport', [
            'userresponses' => $this->userresponses ?: DB::table('user_response as g')
            ->select(
                DB::raw('g.created_at as created_date'),
                    'g.msisdn', 
                    'g.game_code', 
                    'g.answer',
                    'g.answer_code',
                    'g.Amount_charged',
                    'g.payment_ref',
                    'g.status',
                    'g.user_channel'                
                )             
            ->orderByRaw('g.created_at DESC')
        ]);
    } 

    private $headings = [
        'Date Created',
        'MSISDN',
        'game_code',
        'Answer',
        'Channel'
    ]; 

    public function headings(): array
    {
        return $this->headings;
    }

    public function registerEvents(): array
    {
        return [
            AfterSheet::class    => function(AfterSheet $event) {
                $cellRange = 'A1:E1'; // All headers
                $event->sheet->getDelegate()->getStyle($cellRange)->getFont()->setSize(14);
            },
        ];
    }

}

路线

Route::get('/report/userresponse-report/{export?}', ['as' => 'userresponseReport', 'uses' => 'ReportController@userresponseReport']);

在视图刀片上,当我单击搜索时,一切正常。但是当我点击导出时,我得到了这个错误:

错误异常 (E_ERROR) 方法 Illuminate\Support\Collection::links 不存在。 (查看:C:\xampp\htdocs\bbnaijareport\resources\views\report\userresponseReport.blade.php) 以前的例外 方法 Illuminate\Support\Collection::links 不存在。 (0)

我该如何解决这个问题?

新错误

【问题讨论】:

    标签: laravel maatwebsite-excel


    【解决方案1】:

    那是因为您在userresponseReport.blade.php 中显示了分页,但您没有在导出部分加载它。因此,要么将导出功能也分页,要么在链接周围进行检查:

    @if($userresponses instanceof \Illuminate\Pagination\AbstractPaginator )
        <tr>
            <td colspan="14">
                {{ $userresponses->links() }}
            </td>
        </tr>  
    @endif
    

    Credits to Richie

    【讨论】:

    • 我按照你的建议做了,但我遇到了一个新错误。我使用名为 new_error 的快照更新了我的代码。另请参阅摘要:“未定义属性:Illuminate\Database\MySqlConnection::$created_date(查看:C:\xampp\htdocs\bbnaijareport\resources\views\report\userresponseReport.blade.php)
    • @user11352561 通常会在发生此类事情时发布一个新问题(修复前一个错误之后的一个新错误),但无论如何我都会在此评论中回答:你总共有两个用户响应的不同查询并使用相同的视图导出数据以将其显示给用户。确保您拥有相同的数据或拥有单独的导出视图。
    • 这就是导致我尝试导出视图的原因。我曾尝试使用单独的视图,但导出的是所有内容而不是过滤后的数据数据。有什么办法可以帮助我。我已经很久了
    • @user11352561 是的,当然!最好的解决方案(在我看来)是将数据检索(将所有内容从数据库中取出并开始分页和其他内容的部分)移动到单一方法。这有助于您为显示和导出方法获取完全相同的数据。 DRY:不要重复自己。如果您两次或多次使用相同的代码,请为其制作单独的部分。
    • @user11352561 所以在这种情况下:创建一个单独的文件(文件 1),在其中检索 userresponses 并使用普通控制器中的代码(文件 2)。如果您已经这样做了,请从控制器(文件 2)中的该文件(文件 1)中检索数据并将其推送到视图。在导出类(文件 3)中,删除从数据库中检索数据的部分并调用新创建的文件(文件 1)。这将修复错误。
    猜你喜欢
    • 2021-05-27
    • 2021-09-27
    • 2021-10-25
    • 2020-11-20
    • 2022-01-22
    • 2020-06-09
    • 2021-04-27
    • 2019-05-25
    • 2020-08-16
    相关资源
    最近更新 更多