Estoy usando laravel para un proyecto que estoy haciendo. Entonces, quiero que los usuarios solo puedan crear 30 productos, y si tienen más de 30 productos, no pueden crear más productos hasta que hayan eliminado algunos. ¿Qué debo agregar en mi código para que no puedan agregar más productos?

Mi controlador de producto

  public function store(Request $request)
{
    //check if user has more then 30 products

    $product = Product::create($request->all());
    $productPhotos = [];
    $photos = $request->post('photo');

    if (count($photos) <= 5) {
        foreach (range(1, $photos) as $i) {
            foreach ($photos as $imageData) {
                $bcheck = explode(';', $imageData);
                if (count($bcheck) > 1) {
                    list($type, $imageData) = explode(';', $imageData);
                    list(, $extension) = explode('/', $type);
                    list(, $imageData) = explode(',', $imageData);
                    $fileName = uniqid() . '.' . $extension;
                    $imageData = base64_decode($imageData);
                    Storage::put("public/products/$fileName", $imageData);
                    $imagePath = ('storage/products/' . $fileName);

                    $productPhotos[] = ProductPhoto::create([
                        'product_id' => $product->id,
                        'path' => $imagePath
                    ]);
                }
            }
        }
    } else {
        return response()->json("You cant add any photo's to your product", 400);
    }


    return response()->json([$product, $productPhotos], 201);
}

Si necesito enviar más código, avíseme.

Gracias de antemano.

CÓDIGO FINAL

   $totalProduct = Product::where('supplier_id', $request->user()->Supplier->id)->count();

    if ($totalProduct < 30){
        $product = Product::create($request->all());
        $productPhotos = [];
        $photos = $request->post('photo');


        if (count($photos)) {
            foreach ($photos as $i => $imageData) {

                if ($i >= 5) {
                    continue;
                }
                $bcheck = explode(';', $imageData);
                if (count($bcheck) > 1) {
                    list($type, $imageData) = explode(';', $imageData);
                    list(, $extension) = explode('/', $type);
                    list(, $imageData) = explode(',', $imageData);
                    $fileName = uniqid() . '.' . $extension;
                    $imageData = base64_decode($imageData);
                    Storage::put("public/products/$fileName", $imageData);
                    $imagePath = ('storage/products/' . $fileName);

                    $productPhotos[] = ProductPhoto::create([
                        'product_id' => $product->id,
                        'path' => $imagePath
                    ]);
                }

            }
        }
        return response()->json([$product, $productPhotos], 201);

    } else{
        return response()->json("you have to much products", 201);
    }

}
0
JabirM 14 nov. 2018 a las 17:00

4 respuestas

La mejor respuesta

Modelo de usuario

public function projects()
{
     return $this->hasMany('App\Project', 'id', 'user_id');
}

Modelo de proyecto

public function users()
{
     return $this->belongsTo('App\User', 'user_id', 'id');
}

Controladora para agregar proyectos

public function store(Request $request)
{
     $totalCreatedProjects = $request->user()->products->count();
     if ($totalCreatedProjects < 30) {
            `Your code to add projects here`
     }
     `Your code to alert maximum projects achieved here`    
}

Este ejemplo asumió:
1. Sus usuarios están autenticados;
2. Creó una relación de base de datos 1 a muchas entre Proyectos y Usuarios;

Notas: Cuando se compara con la cantidad de proyectos que existen y el número que desea mantener la creación en lugar de continuar, esto debería ser un servicio. El número debe ser una constante con una semántica adecuada para que otros desarrolladores entiendan lo que está tratando de lograr.

1
Diogo Santo 14 nov. 2018 a las 14:25

En el modelo de usuario Agregar

public function canAddNewProduct() { return $this->products->count() < 30; }

En El controlador

Auth::guard('web')->user()->canAddNewProduct()

La mejor manera de hacerlo es crear un nuevo middleware y usar

return Auth::guard('web')->user()->canAddNewProduct() ? true : false

Para proteger las rutas

0
Dawood Akram 14 nov. 2018 a las 17:56
public function store(Request $request)
{
    //check if user has more then 29 products
    if ($request->user()->products->count() >= 30) {
        return response()->json("You cant add more then 30 products", 400);
    }

    // Your code...
0
aleksejjj 14 nov. 2018 a las 14:13

Puede utilizar esto:

public function store(Request $request)
{
    if($request->user()->products->count() < 30) {

         //Add product
         ...

    }else{
        return redirect()->back();
    }
 }
1
hktang 14 nov. 2018 a las 14:17