He estado buscando en la web durante bastante tiempo y he intentado agregar la protected $table = "brands"; a mi modelo de marca como se ve aquí:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Brand extends Model
{
    protected $table = "brands";
    use HasFactory;
    protected $fillable = [
        'brand_name',
        'brand_image'
    ];
}

Luego en mi controlador tengo el siguiente código:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Brand;
use Illuminate\Support\Carbon;

class BrandController extends Controller
{
    public function AllBrand(){
        $brands = Brand::latest()->paginate(2);
        return view('admin.brand.index', compact('brands'));
    }

    public function StoreBrand(Request $request){
        $validatedData = $request->validate([
            'brand_name' => 'required|unique:brand|min:4',
            'brand_image' => 'required|mimes:jpg,jpeg,png',
        ],
        [
            'brand_name.required' => 'Please input brand name',
            'brand_image.min' => 'Brand longer than 4 Characters'
        ]);

        $brand_image = $request->file('brand_image');
        $name_gen = hexdec(uniqid());
        $img_ext = strtolower($brand_image->getClientOriginalExtension());
        $img_name = $name_gen.'.'.$img_ext;
        $upload_location = 'images/brand/';
        $publish_image =  $upload_location.$img_name;
        $brand_image->move($upload_location,$img_name);

        Brand::insert([
            'brand_name' => $request->brand_name,
            'brand_image' => $publish_image,
            'created_at' => Carbon::now()
        ]);

        return Redirect()->back()->with('success', 'Brand added successfully!');
    }
}

Pasando esto a través de mis rutas:

// For Brand Route
Route::get('/brand/all', [BrandController::class, 'AllBrand'])->name('all.brand');

Route::post('/brand/add', [BrandController::class, 'StoreBrand'])->name('store.brand');

Que también utilicé en mi forma dentro views/admin/brand folder:

<form action="{{ route('store.brand') }}" method="POST" enctype="multipart/form-data">
    @csrf
  <input type="text" name="brand_name" placeholder="Brand name"/>
  @error('brand_name')
  <span style="color: red; font-weight: bold;"> {{ $message }}</span>
  @enderror

La tabla de mi base de datos se llama brands pero agregar protected $table = "brands"; no resolvió esto. Incluso traté de volver a emigrar y hacer esto de nuevo, pero nada parece funcionar en absoluto.

¿Hay más formas de resolver este problema? Sigo obteniendo la marca SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel8.brand' doesn't exist (SQL: select count(*) as aggregate from where BRAND_NAME = Bx LLC) Error Cada vez que estoy agregando una nueva marca.

¡Por favor, ayúdenme!

1
Jones Smith 8 jun. 2021 a las 10:40

2 respuestas

La mejor respuesta

El problema no está en el almacenamiento de la marca, sino en validación:

En su validación:

'brand_name' => 'required|unique:brand|min:4',

Esto le dijo a Laravel para asegurarse de que la ingeniosa marca de marca en la tabla 'Marca', por lo que cuando se cometió la consulta, ves ese error.

Esta validación debe ser:

'brand_name' => 'required|unique:brands|min:4',
3
OMR 8 jun. 2021 a las 07:44

En lugar de especificar el nombre de la tabla directamente, puede especificar el modelo elocuente que se debe usar para determinar el nombre de la tabla:

  'brand_name' => 'required|unique:App\Models\Brand|min:4',

Ref: https://laravel.com/docs/8.x/validation# regla-única

1
John Lobo 8 jun. 2021 a las 07:49