Carlos Benito
Carlos Benito
Laravel
Comparte:

vídeo 28 del curso desarrollo de un blog con manejo de roles y permisos

Al guardar la imagen mediante dropzone en la tabla Photos no guarda el id del proudcto, he añadido el campo nullable en la migración de la tabla Photos pero al hacer eso el campo Post_id aparece Null.
Carlos Benito
Carlos Benito (392 xp)
Migración de Photos
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePhotosTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('photos', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedInteger('product_id');
            $table->string('url');
            $table->timestamps();
        });
    }


PhotosController
<?php

namespace App\Http\Controllers\Admin;

use App\Product;
use App\Photo;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;

class PhotosController extends Controller
{
    public function store(Product $product)
    {
    $this->validate(request(), [
    'photo' => 'required|image|max:2048'
    ]);

    $photo = request()->file('photo')->store('public');

    Photo::create([
    'url' => Storage::url($photo),
    'product_id' => $product->id,
    ]);
    }
}
Model Product
   public function photos()
  {
    return $this->hasMany(Photo::class);
  }

el error que aparece al guardar es: 

  1. message: "SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'product_id' cannot be null (SQL: insert into `photos` (`url`, `product_id`, `updated_at`, `created_at`) .....
Alex Dev
Alex Dev (1932 xp)
Hola, es un problema con las llaves foraneas, cambia en tu migración el tipo de dato por bigIncrements('id') y el unsignedBigInteger('product_id') y en tu modelo agregar el atributo en el protected $fillable = ['product_id', 'url']

 
public function up()
    {
        Schema::create('photos', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('post_id');
            $table->string('url');
            $table->timestamps();
        });
    } 


Carlos Benito
Carlos Benito (392 xp)
No ha funcionado, el problema lo tengo en el photosController.php creo que esta línea no recoge el id del producto....

'product_id' => $product->id,

ya que cuando la guarda en la tabla fotos... es Null.
Carlos Benito
Carlos Benito (392 xp)
En la vista edit.blade.php hago un {{dd($product->id)}} y veo bien el product_id del producto, luego en la vista tengo este código:
 <form method="POST" action="{{ route('admin.products.update', $product) }}">
            @method('PUT')
            @csrf
              <div class="box-body">
                <div class="form-group {{$errors->has('title') ? 'has-error' : ''}}">
                  <label>Title</label>
                  <input name="title" value="{{old('title', $product->title)}}" class="form-control" placeholder="Ecribir nombre del producto...">
                  {!! $errors->first('title', '<span class="alert-danger">:message</span>')!!}
                </div>
                <div class="form-group {{$errors->has('description') ? 'has-error' : ''}}">
                  <label>Extracto</label>
                  <textarea name="description" class="form-control" placeholder="Introduce un extracto">{{old('description', $product->description)}}</textarea>
                  {!! $errors->first('description', '<span class="alert-danger">:message</span>')!!}

Carlos Benito
Carlos Benito (392 xp)
Veo que la variable Product declarada en store es NULL cuando hago un dd en PhotosController.php

namespace App\Http\Controllers\Admin;
use App\Photo;
use App\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use App\Http\Controllers\Controller;

class PhotosController extends Controller
{
    public function store(Product $product)
    {
    dd($product->id);
    $this->validate(request(), [
    'photo' => 'required|image|max:2048'
    ]);

    $photo = request()->file('photo')->store('public');

    foreach($request->product as $product) {
    $this->productStockRepository->create($product);
}

    Photo::create([
    'url' => Storage::url($photo),
    'product_id' => $product->id,
    ]);
    }
}
Carlos Benito
Carlos Benito (392 xp)
Solucionado!!, era en el archivo web.php tenía Route::post('products/{id}/photos', 'PhotosController@store')->name('admin.products.photos.store'); en vez de Route::post('products/{product}/photos', 'PhotosController@store')->name('admin.products.photos.store');, gracias Alex por todo.
1