как добавить пользовательский (новый) столбец в результат коллекции разбиения на страницы laravel

Я создаю API и хочу добавить дополнительный столбец в результат запроса на разбиение на страницы. Например, у меня есть цена и скидка в моей базе данных. Я хочу отправить столбец discounted_price с набором результатов.

Вот что я пробовал до сих пор:

Контроллер:

$products = Products::latest()->paginate(10);
if (! empty($products)) {
    $final_prod = [];
    foreach ($products as $product) {
        $final_prod[] = $product->asFilterJson();
    }
    $data['products'] = $final_prod;
    $data['status'] = 200;
} else {
    $data['error'] = "No product available";
}

и в моей модели продуктов у меня есть

public function asFilterJson() {
    $json = [];
    $json['id'] = $this->id;
    $json['title'] = $this->title;
    $json['category_id'] = $this->category_id;
    $json['price'] = $this->price;
    $json['description'] = $this->description;
    $json['quantity'] = $this->quantity;
    $json['discount'] = $this->discount;
    $json['type_id'] = $this->type_id;
    $json['created_by_id'] = $this->created_by_id;
    $json['created_at'] = $this->created_at;
    $json['updated_at'] = $this->updated_at;
    if($this->type_id == self::ITEM_SPECIAL) {
        $json['discounted_price'] = ($this->discount * $this->price) / 100;    }
    return $json;
}

Он отлично работает, но удаляет нумерацию страниц.


person Ashish    schedule 31.12.2018    source источник
comment
Создайте новую коллекцию и используйте $products-›merge(...);   -  person Milkmannetje    schedule 31.12.2018
comment
пожалуйста, добавьте код, который вы возвращаете с контроллера   -  person Shibon    schedule 31.12.2018


Ответы (3)


вы можете добавить ключ и значение в объект коллекции, используя метод map

$products = Products::latest()->paginate(10);

$itemSpecial = self::ITEM_SPECIAL; //pass variable in closure by using use 

$products->map(function($item) use ($itemSpecial) {
     if($item->type_id == $itemSpecial) {
        $item->discounted_price = ($item->discount * $item->price) / 100; 
     }
     return $item;
});

вы можете использовать состояние также в clourse

person Jignesh Joisar    schedule 31.12.2018

В контроллере

public function index() {
     $products = Products::latest()->paginate(10);
     if (! empty($products)) {
        $final_prod = [];
        foreach ($products as $product) {
             $final_prod[] = $this->asFilterJson($product);
        }
        return response()->json(['status'=>'200','message'=>'Product list ','data'=>$final_prod]);
     } else {
        return response()->json(['status'=>'200','message'=>'No product available','data'=>[]]);
     }
}
// function for extra column add
static function asFilterJson($product){
    $value['discounted_price'] = ($value['discount'] * $value['price']) / 100;
    return $value;
}
person PHP Hupp Technologies    schedule 31.12.2018
comment
он удалил пагинацию - person Ashish; 31.12.2018

Вы можете определить новый мутатор в своей модели.

public function getDiscountedPriceAttribute()
{
     return ($this->discount * $this->price) / 100;
}

После этого вы можете использовать его как $this->discountedPrice

person FGDeveloper    schedule 31.12.2018
comment
позвольте мне проверить это - person Ashish; 31.12.2018
comment
да. Ответ Jignesh полезен и решил мой вопрос - person Ashish; 02.01.2019