首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在laravel 5.8中定位函数调用

在laravel 5.8中定位函数调用
EN

Stack Overflow用户
提问于 2020-08-22 01:12:31
回答 1查看 57关注 0票数 1

你好,我是新来的,但不是php。我的任务是优化一些后端查询,我需要一些帮助来定位模型函数"getPackagesSoldAttribute“在这里被调用的位置。在控制器中,我看不到这个函数是像ProEvent::getPackagesSoldAttribute这样调用的。

所以我的视图显示的是函数的返回。你知道laravel是怎么调用这个函数的吗?我还检查了PHP DebugBar,我看到了getPackagesSoldAttribute函数使用的查询。

我还创建了一个脚本,该脚本将定位字符串"getPackagesSoldAttribute“,但只能在模型中找到一个。

代码语言:javascript
复制
Route::get('{organiser_id}/pro_events/{filter?}', [
            'as'   => 'showOrganiserProEvents',
            'uses' => 'OrganiserProEventsController@showOrganiserProEvents',
        ]);

这是由路由调用的控制器函数。

代码语言:javascript
复制
public function showOrganiserProEvents(Request $request, $organiser_id, $filter = null, $listView = null)
    {
        $add_on_check       = \App\Models\OrganisationAddon::where('org_id', $organiser_id)->first();
        $edit_create_enable = "";
        $delete_enable      = "";

        if( !empty($add_on_check) ){
            $add_ons            = json_decode($add_on_check->add_ons);
            $edit_create_enable = !empty($add_ons->enable_create_edit_event)?"1":"";
            $delete_enable      = !empty($add_ons->enable_delete_event)?"1":"";
        }

        $organiser = Organiser::find($organiser_id);

        $allowed_sorts = ['created_at', 'event_date', 'title'];

        $searchQuery = $request->get('q');
        $sort_by = (in_array($request->get('sort_by'), $allowed_sorts) ? $request->get('sort_by') : 'event_date');
        $eventListView =  empty($request->get('view_list_by')) ? 'grid' : $request->get('view_list_by');

        if($listView){
            $eventListView = $listView;
        }

        if($filter == null){
            $filter = "live";
        }

        if( $searchQuery ){

            $the_event = ProEvent::where('title', 'like', '%' . $searchQuery . '%');

            if($sort_by == 'event_date'){
                $the_event->orderBy($sort_by, 'asc');
            } else {
                $the_event->orderBy($sort_by, 'desc');
            }

            $the_event->where('organiser_id', '=', $organiser_id);

            if( $filter == "templates"){
                $the_event->where(function($query){
                    $query->where('event_status', 'template');
                    $query->orWhere('is_master', 1);
                });
            }else if( $filter == "live" ){
                $the_event->where('event_status', "live");
            }else if( $filter == "past" ){
                $the_event->where(function($query){
                    $query->where('event_status', 'past');
                    $query->orWhere('event_date', '<', Carbon::now());
                });
            }else if( $filter == "testing" ){
                $the_event->where(function($query){
                    $query->where('event_status', 'testing');
                    $query->orWhere('event_status', 'pos_testing');
                });
            }else if( $filter == "abandoned" ){
                $the_event->where('event_status', "abandoned");
            }

            $events = $the_event->get();

        }else{

            $the_event = ProEvent::where('organiser_id', '=', $organiser_id);

            if($sort_by == 'event_date'){
                $the_event->orderBy($sort_by, 'asc');
            } else {
                $the_event->orderBy($sort_by, 'desc');
            }

            if( $filter == "templates"){
                $the_event->where(function($query){
                    $query->where('event_status', 'template');
                    $query->orWhere('is_master', 1);
                });
            }else if( $filter == "live" ){
                $the_event->where('event_status', "live");
            }else if( $filter == "past" ){
                $the_event->where(function($query){
                    $query->where('event_status', 'past');
                    $query->orWhere('event_date', '<', Carbon::now());
                });
            }else if( $filter == "testing" ){
                $the_event->where(function($query){
                    $query->where('event_status', 'testing');
                    $query->orWhere('event_status', 'pos_testing');
                });
            }else if( $filter == "abandoned" ){
                $the_event->where('event_status', "abandoned");
            }

            $events = $the_event->get();

        }

        $data = [
            'event_types' => $organiser->pro_event_types,
            'events'    => $events,
            'organiser' => $organiser,
            'search'    => [
                'q'        => $searchQuery ? $searchQuery : '',
                'sort_by'  => $request->get('sort_by') ? $request->get('sort_by') : '',
                'showPast' => $request->get('past'),
            ],
            'edit_create_enable' => $edit_create_enable,
            'delete_enable'      => $delete_enable,
            'filter'             => $filter,
            'eventListView'      => $eventListView

        ];

        return view('ManageEmsPro.ProEvents', $data);
    }

这就是模型

代码语言:javascript
复制
namespace App\Models;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Session;
use Str;
use URL;
use Illuminate\Http\UploadedFile;
use File;
use Image;
use Log;
use Storage;

class ProEvent extends MyBaseModel
{
    use SoftDeletes;

    protected $table   = 'pro_events';
    protected $appends = array('packages_sold', 'bundles_sold');

    /**
     * The validation rules.
     *
     * @var array $rules
     */
    protected $rules = [
        'information_link'     => ['regex:/^(https?:\/\/)([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/'],
        'redirect_link_url'    => ['regex:/^(https?:\/\/)([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/'],
        'web_sales_start_date' => ['required'],
        'sales_start_date'     => ['required'],
        'open_time'            => ['required'],
        'close_time'           => ['required'],
        'title'                => ['required'],
        'description'          => ['required'],
        'event_date'           => ['required'],
        'organiser_name'       => ['required_without:organiser_id'],
        'event_image'          => ['mimes:jpeg,jpg,png', 'max:3000'],
        'custom_url'           => ['regex:/(^[\w\d_-]+$)/u'],
        'payment_percentage'   => ['numeric', 'between:0,99.99', 'min:1'],
        'event_logo'           => ['mimes:jpeg,jpg,png', 'max:1000'],
        'organiser_event_logo' => ['mimes:jpeg,jpg,png', 'max:1000'],
    ];

    /**
     * The validation error messages.
     *
     * @var array $messages
     */
    protected $messages = [
        'title.required'                       => 'You must at least give a title for your event.',
        'organiser_name.required_without'      => 'Please create an organiser or select an existing organiser.',
        'event_image.mimes'                    => 'Please ensure you are uploading an image (JPG, PNG, JPEG)',
        'event_image.max'                      => 'Please ensure the image is not larger then 3MB',
        'custom_url.regex'                     => 'Allowed special characters are only "_" and "-"',
        'event_logo.mimes'                     => 'Please ensure you are uploading an image (JPG, PNG, JPEG)',
        'event_logo.max'                       => 'Please ensure the image is not larger then 1MB',
    ];

...

public function getPackagesSoldAttribute(){
        $valid_packages  = PackageInventoryMap::where("pro_event_id", $this->id)->pluck('package_id');
        $valid_orders    = ProOrders::whereNotIn("order_status_id", [2,4])->where("organiser_id", $this->organiser_id)->pluck('id');
        $pro_order_items = ProOrderItem::whereIn('pro_order_id', $valid_orders)
                                ->where("pro_event_id", $this->id)
                                ->whereIn('package_id', $valid_packages)
                                ->whereNull("bundle_ids")
                                ->sum('quantity');
        return (integer)$pro_order_items;
    }

...

这是视图的一部分。

代码语言:javascript
复制
<div class="row">
        @if($events->count())
            @if($eventListView == "grid")
                <div class="col-sm-12 grid-search">
                    <div class="col-sm-offset-6 col-sm-6">
                        <div class="pull-right lh-2">
                            Search: <input class="form-control pull-right input-sm grid-filter">
                        </div>
                    </div>
                </div>
                
                @foreach($events as $key => $event)
                    <div class="col-md-6 col-sm-6 col-xs-12 data-event-block" data-event-block="{{ $key+1 }}" style="display: {{ $key <= 9 ? 'block' : 'none' }}">
                        @include('ManageEmsPro.Partials.EventPanel')
                    </div>
                @endforeach
            @elseif($eventListView == "table")
                <div class="col-md-12">
                    @include('ManageEmsPro.Partials.EventTable')
                </div> 
            @endif
        @else
            @if($search['q'])
                @include('Shared.Partials.NoSearchResults')
            @else
                @include('ManageEmsPro.Partials.EventsBlankSlate')
            @endif
        @endif
    </div>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-22 01:22:30

参见Eloquent: MutatorsgetPackagesSoldAttribute是一个“访问器”方法。基本上,你不会看到getPackagesSoldAttribute被直接调用,相反,当代码在后台调用$model->packages_sold时,laravel实际上会动态调用$model->getPackagesSoldAttribute,并以该值的形式返回响应。

例如,如果要调试或测试此方法,可以执行以下操作:

代码语言:javascript
复制
$event = ProEvent::find($someId);
$packagesSold = $event->packages_sold; // this line will call the  `getPackagesSoldAttribute` and set `$packagesSold` to the value it returns.

同样值得注意的是:

这里的模型还使用packages_sold定义了appends属性

代码语言:javascript
复制
protected $appends = array('packages_sold', 'bundles_sold');

这将导致每当模型表示为数组或序列化模型时,packages_sold属性都会由相关的方法自动填充。另请参阅Appending Values To JSON

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63527274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档