Laravel фильтр данных после с закрытием - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть один довольно простой вопрос, представьте, что у меня есть модель Orders, и теперь я пишу что-то вроде этого:

Order::where('status', 1)->with('orderer')->get();

Хорошо.Это просто и возвращает что-то вроде этого:

 {
      id: 1,
      price: 200,
      status: 1,
      income: 21,
      orderer_id: 4,
      orderer: {
        //some orderer fields
      }
  }

Теперь я не хочу получать весь объект, я хочу удалить свойства income, orderer_id и status из данных.если я напишу что-то вроде этого: get(["id", "price"]) Я останусь без объекта orderer (get(["id", "price", "orderer"]) тоже не работает), я не смог бы заставить его работать, даже используя select (), так какое же решение?Также я не хочу скрывать это от всех, например, администратор должен знать доход, а пользователь - нет, поэтому поле $ hidden не будет работать.

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Если вы ищете встроенный в Laravel способ справиться с этим, вы можете использовать ресурсы API: https://laravel.com/docs/5.7/eloquent-resources

php atrisan make:resource OrderResource

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class OrderResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        $current_role = $request->user()->role; //or however you determine admin etc

        $out = [
            'id'    => $this->id,
            'price' => $this->price,
            'orderer'=> $this->orderer,
        ];

        if($current_role == 'admin'){

            $out['income'] = $this->income;
            $out['status'] = $this->status;

        }
        return $out;
    }
}

В вашем действии контроллера

return OrderResource::collection(Order::where('status', 1)->with('orderer')->get());

Если вы хотите что-то более надежное, рассмотрите https://github.com/spatie/laravel-fractal

0 голосов
/ 14 февраля 2019

Вы можете добавить select(), но убедитесь, что select не принимает массив, а разделенные запятыми аргументы:

$orders = Order::where('status', 1)->with('orderer');

if($user->role == 'admin'){
   $orders->select('id','income','status','price');
}
else{
   $orders->select('id','status','price');
}

$orders = $orders->get();

Выше сначала проверит текущую роль пользователя, вошедшего в систему, и, соответственно, выберет необходимые столбцы.

0 голосов
/ 13 февраля 2019

https://scotch.io/bar-talk/hiding-fields-when-querying-laravel-eloquent-models

В вашей модели Order Eloquent:

protected $hidden = array('hide_this_field', 'and_that_field');

Редактировать: Вы хотите фильтровать по роли администратора или пользователя, в следующий раз, пожалуйста, запишите это в своем вопросетакже.Хорошо, решение для этого состоит в том, чтобы захватить результат запроса к БД и просмотреть этот массив, а затем сбросить свойства модели, если пользователь не является администратором.

Edit2: я также вижу здесь обсуждение, которое может помочь.Некоторые пользователи предложили использовать промежуточное ПО: https://laracasts.com/discuss/channels/laravel/hide-eloquent-fields-based-on-user-role-or-any-model

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...