рдирдорд╕реНрддреЗ
рдорд╛рдлрд╝ рдХрд░рдирд╛
рдореЗрд░реА рдЕрдВрдЧреНрд░реЗрдЬрд╝реА рдЕрдЪреНрдЫреА рдирд╣реАрдВ рд╣реИ;
рдЦреЛрдЬ рд╕рдВрдмрдВрдзрд┐рдд рдореЙрдбрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИ
рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЙрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реИ
рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрд╡рд╛рдж рдЬрд╣рд╛рдВ рдЦрдВрдб рдЫрдБрдЯрд╛рдИ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ
рдХреЛрдИ рднреА рд╕рдорд╛рдзрд╛рди ?
class OrderFood extends Model
{
protected $table = 'order_foods';
protected $fillable = [
'order_id','food_id','quantity','food_price'
];
public function order()
{
return $this->belongsTo(Order::class);
}
public function food()
{
return $this->belongsTo(Food::class)
->with('translate');
}
}
class Food extends Model
{
protected $table = 'foods';
protected $fillable = [
'title','date','tax','tax_enabled','tax_included','images','star','description','recipes','status','lang'
];
public function translate()
{
return $this->hasOne(FoodTranslator::class,'food_id')
->where('lang',app()->getLocale());
}
}
public function query()
{
DB::statement(DB::raw('set @rownum=0'));
DB::statement(DB::raw('SET collation_connection = utf8_general_ci'));
DB::statement(DB::raw('SET character_set_connection = utf8'));
$order_id = $this->order_id;
$order_foods = Order::find($order_id)->foods()->with(['food.translate'])->select(['*','order_foods.created_at',DB::raw('<strong i="5">@rownum</strong> := <strong i="6">@rownum</strong> + 1 AS rownum')]);
return $this->applyScopes($order_foods);
}
private function getColumns()
{
return [
['title' => trans('form.row'),'name' => 'rownum', 'data' => 'rownum','searchable'=>false],
['title' => trans('order.order_food'),'name' => 'food.translate.title', 'data' => 'food.translate.title','orderable'=>false],
['title' => trans('order.quantity'),'name' => 'quantity', 'data' => 'quantity'],
['title' => trans('order.food_price'),'name' => 'food_price', 'data' => 'food_price'],
['title' => trans('form.created_at'),'name' => 'created_at', 'data' => 'created_at'],
['title' => trans('form.action'),'name' => 'action', 'data' => 'action','searchable'=>false,'exportable'=>false,'printable'=>false],
];
}
рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА v8 рдкрд░ рддрдп рдХреА рдЧрдИ рдереАред рдпрд╣ Laravel 5.4 рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕реЗ рдЕрднреА рддрдХ рд╕реНрдерд┐рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЯреИрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!
рдмрд╣реБрдд - рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!
рдпрд╣ рд╕рдорд╕реНрдпрд╛ v8 . рдореЗрдВ рдареАрдХ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ
рдореБрдЭреЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рдЕрдиреБрд╡рд╛рдж рд╕рдВрдмрдВрдз рдкрд░ рд╣реИ, рд╣реИ рдирд╛?
public function translate()
{
return $this->hasOne(FoodTranslator::class,'food_id')
->where('lang',app()->getLocale());
}
рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрд▓реЙрдЬ рдХрд╣рд╛рдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реБрдЖ? рдЗрд╕реЗ v8 рдкрд░ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореИрдВ рдирд╣реАрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ?
3 рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЖрджреЗрд╢ рджреЗрдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
1:
bindings:[]
query:"select count(*) as aggregate from (select '1' as `row_count` from `foods`) count_row_table"
time:0.29
2:
bindings:[]
query:"select *, <strong i="6">@rownum</strong> := <strong i="7">@rownum</strong> + 1 AS rownum from `foods` left join `food_translator` on `food_translator`.`food_id` = `foods`.`id` order by `food_translator`.`title` desc limit 10 offset 0"
time:0.81
3:
bindings:["fa", 1]
query:"select * from `food_translator` where `lang` = ? and `food_translator`.`food_id` in (?)"
time:0.46
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓реЙрдЬ рджреВрд╕рд░реА рдХреНрд╡реЗрд░реА рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рди рдХрд┐ 3
рдпрд╣ рдкреНрд░рд╢реНрди
query:"select * from `food_translator` where `lang` = ? and `food_translator`.`food_id` in (?)"
рдХреЗ рд▓рд┐рдП рд╣реИ
public function translate()
{
return $this->hasOne(FoodTranslator::class,'food_id')
->where('lang',app()->getLocale());
}
рдЬрд┐рд╕рдХрд╛ рдЕрд╕рд░ рдирддреАрдЬреЛрдВ рдкрд░ рдирд╣реАрдВ рдкрдбрд╝рддрд╛
@aliworkshop рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдм рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред рдореМрдХрд╛ рдорд┐рд▓рдиреЗ рдкрд░ рдЗрд╕реЗ рдФрд░ рдЦреЛрджреВрдВрдЧрд╛ред
рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж рдорд╛рд╕реНрдЯрд░ :)
рддреНрд░реБрдЯрд┐ рддрдп рдирд╣реАрдВ рд╣реИ?
рдореИрдВрдиреЗ рдирд╛рдо рд╕реНрдерд╛рди Yajra\DataTables рдореЗрдВ EloquentDataTable рд╡рд░реНрдЧ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рддрдп рдХреА
protected function joinEagerLoadedColumn($relation, $relationColumn)
{
$table = '';
$lastQuery = $this->query;
foreach (explode('.', $relation) as $eachRelation) {
$model = $lastQuery->getRelation($eachRelation);
$fillable = [];
switch (true) {
case $model instanceof BelongsToMany:
$pivot = $model->getTable();
$pivotPK = $model->getExistenceCompareKey();
$pivotFK = $model->getQualifiedParentKeyName();
$this->performJoin($pivot, $pivotPK, $pivotFK);
$related = $model->getRelated();
$table = $related->getTable();
$tablePK = $related->getForeignKey();
$foreign = $pivot . '.' . $tablePK;
$other = $related->getQualifiedKeyName();
$lastQuery->addSelect($table . '.' . $relationColumn);
$this->performJoin($table, $foreign, $other);
break;
case $model instanceof HasOneOrMany:
$table = $model->getRelated()->getTable();
$foreign = $model->getQualifiedForeignKeyName();
$other = $model->getQualifiedParentKeyName();
$fillable = $model->getRelated()->getFillable();
break;
case $model instanceof BelongsTo:
$table = $model->getRelated()->getTable();
$foreign = $model->getQualifiedForeignKey();
$other = $model->getQualifiedOwnerKeyName();
break;
default:
throw new Exception('Relation ' . get_class($model) . ' is not yet supported.');
}
$this->performJoin($table, $foreign, $other,'inner',$fillable);
$lastQuery = $model->getQuery();
}
return $table . '.' . $relationColumn;
}
protected function performJoin($table, $foreign, $other, $type = 'left', $fillable = [])
{
$joins = [];
foreach ((array) $this->getBaseQueryBuilder()->joins as $key => $join) {
$joins[] = $join->table;
}
if (! in_array($table, $joins)) {
$this->getBaseQueryBuilder()->join($table, $foreign, '=', $other, $type);
if (in_array('lang',$fillable))
$this->query->where('lang', app()->getLocale());
}
}
рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ lang
рдХреЙрд▓рдо рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХреНрд╡реЗрд░реА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓реЙрдЬ рд╣реИ
рдЕрдЧрд░ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдЙрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрддрд╛ рдЬрд╣рд╛рдВ рдЦрдВрдб рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рд╣реЛрдВрдЧреЗ
рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛
@aliworkshop рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдХреНрдпрд╛ рдЖрдк рд╢рд╛рдпрдж рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдмрджрд▓рдиреЗ рдХреЗ:
$this->getBaseQueryBuilder()->join($table, $foreign, '=', $other, $type);
рд╕рд╛рде:
$this->query->join($table, $foreign, '=', $other, $type);
рдХрд╛рд░реНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╡реНрдпрд╕реНрдд рд╣реИ рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдУрдПрд╕ рдкрд░ рдЬреНрдпрд╛рджрд╛ рд╕рдордп рд╕рдорд░реНрдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдзрдиреНрдпрд╡рд╛рдж!
рд╣рд╛рдп рдлрд┐рд░ рд╕реЗ рдорд╛рд╕реНрдЯрд░
рдореБрдЭреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ
рдЕрдЧрд░ рд╣рдо EloquentDataTable рдХреНрд▓рд╛рд╕ рдХреЛ рдиреЗрдорд╕реНрдкреЗрд╕ Yajra\DataTables рдореЗрдВ рдЗрд╕ рд░реВрдк рдореЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╢рд╛рдпрдж рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
protected function joinEagerLoadedColumn($relation, $relationColumn)
{
$table = '';
$lastQuery = $this->query;
foreach (explode('.', $relation) as $eachRelation) {
$model = $lastQuery->getRelation($eachRelation);
switch (true) {
case $model instanceof BelongsToMany:
$pivot = $model->getTable();
$pivotPK = $model->getExistenceCompareKey();
$pivotFK = $model->getQualifiedParentKeyName();
$this->performJoin($pivot, $pivotPK, $pivotFK);
$related = $model->getRelated();
$table = $related->getTable();
$tablePK = $related->getForeignKey();
$foreign = $pivot . '.' . $tablePK;
$other = $related->getQualifiedKeyName();
$lastQuery->addSelect($table . '.' . $relationColumn);
$this->performJoin($table, $foreign, $other);
break;
case $model instanceof HasOneOrMany:
$table = $model->getRelated()->getTable();
$foreign = $model->getQualifiedForeignKeyName();
$other = $model->getQualifiedParentKeyName();
break;
case $model instanceof BelongsTo:
$table = $model->getRelated()->getTable();
$foreign = $model->getQualifiedForeignKey();
$other = $model->getQualifiedOwnerKeyName();
break;
default:
throw new Exception('Relation ' . get_class($model) . ' is not yet supported.');
}
$wheres = $model->getQuery()->getQuery()->wheres;
$this->performJoin($table, $foreign, $other,'inner',$wheres);
$lastQuery = $model->getQuery();
}
return $table . '.' . $relationColumn;
}
protected function performJoin($table, $foreign, $other, $type = 'left', $wheres = [])
{
$joins = [];
foreach ((array) $this->getBaseQueryBuilder()->joins as $key => $join) {
$joins[] = $join->table;
}
if (! in_array($table, $joins)) {
$this->query->join($table, $foreign, '=', $other, $type);
foreach ($wheres as $where) {
if ($where['boolean'] == 'and')
$this->query->where($where['column'], $where['operator'], $where['value']);
else
$this->query->orWhere($where['column'], $where['operator'], $where['value']);
}
}
}
рдХреГрдкрдпрд╛ рдЗрд╕ рдХреЛрдб рдХреЛ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВ