Мне нужно вернуть только одну OptionGroup, если у нее одинаковый Id
эти два параметра имеют одну и ту же группу, однако я хотел, чтобы в той части, которая вернула option_groups, только что вернула одну, потому что идентификаторы одинаковые
как вы можете видеть, он возвращает мне массив с тем же идентификатором
Контроллер
<?php
namespace App\Http\Controllers\API;
use App\Criteria\Products\NearCriteria;
use App\Criteria\Products\ProductsOfFieldsCriteria;
use App\Criteria\Products\TrendingWeekCriteria;
use App\Http\Controllers\Controller;
use App\Models\Product;
use App\Repositories\CustomFieldRepository;
use App\Repositories\ProductRepository;
use App\Repositories\UploadRepository;
use Flash;
use Illuminate\Http\Request;
use InfyOm\Generator\Criteria\LimitOffsetCriteria;
use Prettus\Repository\Criteria\RequestCriteria;
use Prettus\Repository\Exceptions\RepositoryException;
use Prettus\Validator\Exceptions\ValidatorException;
/**
* Class ProductController
* @package App\Http\Controllers\API
*/
class ProductAPIController extends Controller
{
/** @var ProductRepository */
private $productRepository;
/**
* @var CustomFieldRepository
*/
private $customFieldRepository;
/**
* @var UploadRepository
*/
private $uploadRepository;
public function __construct(ProductRepository $productRepo, CustomFieldRepository $customFieldRepo, UploadRepository $uploadRepo)
{
parent::__construct();
$this->productRepository = $productRepo;
$this->customFieldRepository = $customFieldRepo;
$this->uploadRepository = $uploadRepo;
}
/**
* Display a listing of the Product.
* GET|HEAD /products
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
try{
$this->productRepository->pushCriteria(new RequestCriteria($request));
$this->productRepository->pushCriteria(new LimitOffsetCriteria($request));
$this->productRepository->pushCriteria(new ProductsOfFieldsCriteria($request));
if($request->get('trending',null) == 'week'){
$this->productRepository->pushCriteria(new TrendingWeekCriteria($request));
}else{
$this->productRepository->pushCriteria(new NearCriteria($request));
}
// $this->productRepository->orderBy('closed');
// $this->productRepository->orderBy('area');
$products = $this->productRepository->all();
} catch (RepositoryException $e) {
return $this->sendError($e->getMessage());
}
return $this->sendResponse($products->toArray(), 'Products retrieved successfully');
}
/**
* Display the specified Product.
* GET|HEAD /products/{id}
*
* @param int $id
*
* @return \Illuminate\Http\JsonResponse
*/
public function show(Request $request, $id)
{
/** @var Product $product */
if (!empty($this->productRepository)) {
try{
$this->productRepository->pushCriteria(new RequestCriteria($request));
$this->productRepository->pushCriteria(new LimitOffsetCriteria($request));
} catch (RepositoryException $e) {
return $this->sendError($e->getMessage());
}
$product = $this->productRepository->findWithoutFail($id);
}
if (empty($product)) {
return $this->sendError('Product not found');
}
return $this->sendResponse($product->toArray(), 'Product retrieved successfully');
}
/**
* Store a newly created Product in storage.
*
* @param Request $request
*
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$input = $request->all();
$customFields = $this->customFieldRepository->findByField('custom_field_model', $this->productRepository->model());
try {
$product = $this->productRepository->create($input);
$product->customFieldsValues()->createMany(getCustomFieldsValues($customFields, $request));
if (isset($input['image']) && $input['image']) {
$cacheUpload = $this->uploadRepository->getByUuid($input['image']);
$mediaItem = $cacheUpload->getMedia('image')->first();
$mediaItem->copy($product, 'image');
}
} catch (ValidatorException $e) {
return $this->sendError($e->getMessage());
}
return $this->sendResponse($product->toArray(), __('lang.saved_successfully', ['operator' => __('lang.product')]));
}
/**
* Update the specified Product in storage.
*
* @param int $id
* @param Request $request
*
* @return \Illuminate\Http\JsonResponse
*/
public function update($id, Request $request)
{
$product = $this->productRepository->findWithoutFail($id);
if (empty($product)) {
return $this->sendError('Product not found');
}
$input = $request->all();
$customFields = $this->customFieldRepository->findByField('custom_field_model', $this->productRepository->model());
try {
$product = $this->productRepository->update($input, $id);
if (isset($input['image']) && $input['image']) {
$cacheUpload = $this->uploadRepository->getByUuid($input['image']);
$mediaItem = $cacheUpload->getMedia('image')->first();
$mediaItem->copy($product, 'image');
}
foreach (getCustomFieldsValues($customFields, $request) as $value) {
$product->customFieldsValues()
->updateOrCreate(['custom_field_id' => $value['custom_field_id']], $value);
}
} catch (ValidatorException $e) {
return $this->sendError($e->getMessage());
}
return $this->sendResponse($product->toArray(), __('lang.updated_successfully', ['operator' => __('lang.product')]));
}
/**
* Remove the specified Product from storage.
*
* @param int $id
*
* @return \Illuminate\Http\JsonResponse
*/
public function destroy($id)
{
$product = $this->productRepository->findWithoutFail($id);
if (empty($product)) {
return $this->sendError('Product not found');
}
$product = $this->productRepository->delete($id);
return $this->sendResponse($product, __('lang.deleted_successfully', ['operator' => __('lang.product')]));
}
}
ProductModel
<?php
/**
* File name: Product.php
* Last modified: 2020.04.29 at 17:43:30
* Author: SmarterVision - https://codecanyon.net/user/smartervision
* Copyright (c) 2020
*
*/
namespace App\Models;
use Eloquent as Model;
use Spatie\Image\Manipulations;
use Spatie\MediaLibrary\HasMedia\HasMedia;
use Spatie\MediaLibrary\HasMedia\HasMediaTrait;
use Spatie\MediaLibrary\Models\Media;
/**
* Class Product
* @package App\Models
* @version August 29, 2019, 9:38 pm UTC
*
* @property \App\Models\Market market
* @property \App\Models\Category category
* @property \Illuminate\Database\Eloquent\Collection Option
* @property \Illuminate\Database\Eloquent\Collection Nutrition
* @property \Illuminate\Database\Eloquent\Collection ProductsReview
* @property string name
* @property double price
* @property double discount_price
* @property string description
* @property double capacity
* @property boolean featured
* @property double package_items_count
* @property string unit
* @property integer market_id
* @property integer category_id
*/
class Product extends Model implements HasMedia
{
use HasMediaTrait {
getFirstMediaUrl as protected getFirstMediaUrlTrait;
}
/**
* Validation rules
*
* @var array
*/
public static $rules = [
'name' => 'required',
'price' => 'required|numeric|min:0',
'market_id' => 'required|exists:markets,id',
'category_id' => 'required|exists:categories,id'
];
public $table = 'products';
public $fillable = [
'name',
'price',
'discount_price',
'description',
'capacity',
'package_items_count',
'unit',
'featured',
'deliverable',
'market_id',
'category_id'
];
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'name' => 'string',
'image' => 'string',
'price' => 'double',
'discount_price' => 'double',
'description' => 'string',
'capacity' => 'double',
'package_items_count' => 'integer',
'unit' => 'string',
'featured' => 'boolean',
'deliverable' => 'boolean',
'market_id' => 'integer',
'category_id' => 'double'
];
/**
* New Attributes
*
* @var array
*/
protected $appends = [
'custom_fields',
'has_media',
'market'
];
/**
* @param Media|null $media
* @throws \Spatie\Image\Exceptions\InvalidManipulation
*/
public function registerMediaConversions(Media $media = null)
{
$this->addMediaConversion('thumb')
->fit(Manipulations::FIT_CROP, 200, 200)
->sharpen(10);
$this->addMediaConversion('icon')
->fit(Manipulations::FIT_CROP, 100, 100)
->sharpen(10);
}
/**
* to generate media url in case of fallback will
* return the file type icon
* @param string $conversion
* @return string url
*/
public function getFirstMediaUrl($collectionName = 'default', $conversion = '')
{
$url = $this->getFirstMediaUrlTrait($collectionName);
$array = explode('.', $url);
$extension = strtolower(end($array));
if (in_array($extension, config('medialibrary.extensions_has_thumb'))) {
return asset($this->getFirstMediaUrlTrait($collectionName, $conversion));
} else {
return asset(config('medialibrary.icons_folder') . '/' . $extension . '.png');
}
}
public function getCustomFieldsAttribute()
{
$hasCustomField = in_array(static::class, setting('custom_field_models', []));
if (!$hasCustomField) {
return [];
}
$array = $this->customFieldsValues()
->join('custom_fields', 'custom_fields.id', '=', 'custom_field_values.custom_field_id')
->where('custom_fields.in_table', '=', true)
->get()->toArray();
return convertToAssoc($array, 'name');
}
public function customFieldsValues()
{
return $this->morphMany('App\Models\CustomFieldValue', 'customizable');
}
/**
* Add Media to api results
* @return bool
*/
public function getHasMediaAttribute()
{
return $this->hasMedia('image') ? true : false;
}
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
**/
public function category()
{
return $this->belongsTo(\App\Models\Category::class, 'category_id', 'id');
}
/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
**/
public function options()
{
return $this->hasMany(\App\Models\Option::class, 'product_id');
}
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
**/
public function optionGroups()
{
return $this->belongsToMany(\App\Models\OptionGroup::class,'options');
}
/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
**/
public function productReviews()
{
return $this->hasMany(\App\Models\ProductReview::class, 'product_id');
}
/**
* get market attribute
* @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Relations\BelongsTo|object|null
*/
public function getMarketAttribute()
{
return $this->market()->first(['id', 'name', 'delivery_fee', 'address', 'phone']);
}
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
**/
public function market()
{
return $this->belongsTo(\App\Models\Market::class, 'market_id', 'id');
}
}
Модель OptionGroup
namespace App\Models;
use Eloquent as Model;
/**
* Class OptionGroup
* @package App\Models
* @version April 6, 2020, 10:47 am UTC
*
* @property string name
*/
class OptionGroup extends Model
{
public $table = 'option_groups';
public $fillable = [
'name'
];
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'name' => 'string'
];
/**
* Validation rules
*
* @var array
*/
public static $rules = [
'name' => 'required'
];
/**
* New Attributes
*
* @var array
*/
protected $appends = [
'custom_fields',
];
public function customFieldsValues()
{
return $this->morphMany('App\Models\CustomFieldValue', 'customizable');
}
public function getCustomFieldsAttribute()
{
$hasCustomField = in_array(static::class,setting('custom_field_models',[]));
if (!$hasCustomField){
return [];
}
$array = $this->customFieldsValues()
->join('custom_fields','custom_fields.id','=','custom_field_values.custom_field_id')
->where('custom_fields.in_table','=',true)
->get()->toArray();
return convertToAssoc($array,'name');
}
}
Модель Option
<?php
/**
* File name: Option.php
* Last modified: 2020.04.29 at 10:45:05
* Author: SmarterVision - https://codecanyon.net/user/smartervision
* Copyright (c) 2020
*
*/
namespace App\Models;
use Eloquent as Model;
use Spatie\Image\Manipulations;
use Spatie\MediaLibrary\HasMedia\HasMedia;
use Spatie\MediaLibrary\HasMedia\HasMediaTrait;
use Spatie\MediaLibrary\Models\Media;
/**
* Class Option
* @package App\Models
* @version April 6, 2020, 10:56 am UTC
*
* @property \App\Models\Product product
* @property \App\Models\OptionGroup optionGroup
* @property string name
* @property string description
* @property double price
* @property integer product_id
* @property integer option_group_id
*/
class Option extends Model implements HasMedia
{
use HasMediaTrait {
getFirstMediaUrl as protected getFirstMediaUrlTrait;
}
public $table = 'options';
public $fillable = [
'name',
'description',
'price',
'product_id',
'option_group_id'
];
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'name' => 'string',
'image' => 'string',
'description' => 'string',
'price' => 'double',
'product_id' => 'integer',
'option_group_id' => 'integer'
];
/**
* Validation rules
*
* @var array
*/
public static $rules = [
'name' => 'required',
'price' => 'nullable|numeric|min:0',
'product_id' => 'required|exists:products,id',
'option_group_id' => 'required|exists:option_groups,id'
];
/**
* New Attributes
*
* @var array
*/
protected $appends = [
'custom_fields',
'has_media'
];
/**
* @param Media|null $media
* @throws \Spatie\Image\Exceptions\InvalidManipulation
*/
public function registerMediaConversions(Media $media = null)
{
$this->addMediaConversion('thumb')
->fit(Manipulations::FIT_CROP, 200, 200)
->sharpen(10);
$this->addMediaConversion('icon')
->fit(Manipulations::FIT_CROP, 100, 100)
->sharpen(10);
}
public function customFieldsValues()
{
return $this->morphMany('App\Models\CustomFieldValue', 'customizable');
}
/**
* to generate media url in case of fallback will
* return the file type icon
* @param string $conversion
* @return string url
*/
public function getFirstMediaUrl($collectionName = 'default',$conversion = '')
{
$url = $this->getFirstMediaUrlTrait($collectionName);
$array = explode('.', $url);
$extension = strtolower(end($array));
if (in_array($extension,config('medialibrary.extensions_has_thumb'))) {
return asset($this->getFirstMediaUrlTrait($collectionName,$conversion));
}else{
return asset(config('medialibrary.icons_folder').'/'.$extension.'.png');
}
}
public function getCustomFieldsAttribute()
{
$hasCustomField = in_array(static::class,setting('custom_field_models',[]));
if (!$hasCustomField){
return [];
}
$array = $this->customFieldsValues()
->join('custom_fields','custom_fields.id','=','custom_field_values.custom_field_id')
->where('custom_fields.in_table','=',true)
->get()->toArray();
return convertToAssoc($array,'name');
}
/**
* Add Media to api results
* @return bool
*/
public function getHasMediaAttribute()
{
return $this->hasMedia('image') ? true : false;
}
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
**/
public function product()
{
return $this->belongsTo(\App\Models\Product::class, 'product_id', 'id');
}
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
**/
public function optionGroup()
{
return $this->belongsTo(\App\Models\OptionGroup::class, 'option_group_id', 'id');
}
}