Laravel-datatables: рд▓рд╛рд░реНрд╡рд╛ рд╕рдВрдмрдВрдз рдЬрд╣рд╛рдВ рд▓рд╛рд░реНрд╡рд╛ рдбреЗрдЯрд╛рдЯреЗрдмрд▓ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдореЗрдВ рдХреНрд▓реЙрдЬ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдЕрдЧре░ 2017  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: yajra/laravel-datatables

рд╕рдорд╕реНрдпрд╛ рдпрд╛ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢

рдирдорд╕реНрддреЗ
рдорд╛рдлрд╝ рдХрд░рдирд╛
рдореЗрд░реА рдЕрдВрдЧреНрд░реЗрдЬрд╝реА рдЕрдЪреНрдЫреА рдирд╣реАрдВ рд╣реИ;
рдЦреЛрдЬ рд╕рдВрдмрдВрдзрд┐рдд рдореЙрдбрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИ
рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЙрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реИ
рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрд╡рд╛рдж рдЬрд╣рд╛рдВ рдЦрдВрдб рдЫрдБрдЯрд╛рдИ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ

рдХреЛрдИ рднреА рд╕рдорд╛рдзрд╛рди ?

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ

рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рд╡рд░рдг

  • рд▓рд┐рдирдХреНрд╕
  • рдкреАрдПрдЪрдкреА рд╕рдВрд╕реНрдХрд░рдг: 7.1
  • рд▓рд╛рд░рд╡реЗрд▓ рд╕рдВрд╕реНрдХрд░рдг: 5.4
  • рд▓рд╛рд░рд╡реЗрд▓-рдбреЗрдЯрд╛рдЯреЗрдмрд▓реНрд╕ рд╕рдВрд╕реНрдХрд░рдг: 7.0
enhancement for review

рд╕рднреА 14 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

 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']);
            }
        }
    }

рдХреГрдкрдпрд╛ рдЗрд╕ рдХреЛрдб рдХреЛ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

macnux picture macnux  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Mopster picture Mopster  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Abdulhmid picture Abdulhmid  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

shadoWalker89 picture shadoWalker89  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

FilipeBorges1993 picture FilipeBorges1993  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ