你好,我是新来的,但不是php。我的任务是优化一些后端查询,我需要一些帮助来定位模型函数"getPackagesSoldAttribute“在这里被调用的位置。在控制器中,我看不到这个函数是像ProEvent::getPackagesSoldAttribute这样调用的。
所以我的视图显示的是函数的返回。你知道laravel是怎么调用这个函数的吗?我还检查了PHP DebugBar,我看到了getPackagesSoldAttribute函数使用的查询。
我还创建了一个脚本,该脚本将定位字符串"getPackagesSoldAttribute“,但只能在模型中找到一个。
Route::get('{organiser_id}/pro_events/{filter?}', [
'as' => 'showOrganiserProEvents',
'uses' => 'OrganiserProEventsController@showOrganiserProEvents',
]);这是由路由调用的控制器函数。
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);
}这就是模型
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;
}
...这是视图的一部分。
<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>发布于 2020-08-22 01:22:30
参见Eloquent: Mutators。getPackagesSoldAttribute是一个“访问器”方法。基本上,你不会看到getPackagesSoldAttribute被直接调用,相反,当代码在后台调用$model->packages_sold时,laravel实际上会动态调用$model->getPackagesSoldAttribute,并以该值的形式返回响应。
例如,如果要调试或测试此方法,可以执行以下操作:
$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属性
protected $appends = array('packages_sold', 'bundles_sold');这将导致每当模型表示为数组或序列化模型时,packages_sold属性都会由相关的方法自动填充。另请参阅Appending Values To JSON
https://stackoverflow.com/questions/63527274
复制相似问题