загрузите несколько изображений с отношением hasMany

#php #sql #laravel #eloquent

Вопрос:

здравствуйте, я использую laravel 8, у меня есть таблица продуктов и изображений, и я хочу иметь возможность загружать по 3 изображения с каждым продуктом

модель продукта

 class Product extends Model implements Auditable
{
    use HasFactory, AuditableTrait;

    const FILLABLE = ['name','price','description'];
    protected $fillable = ['name','price','description'];
    
    public function images()
    {
        return $this->hasMany(Image::class, 'id');
    }
}
 

миграция продукта

 class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->double('price');
            $table->text('description');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('products');
    }
}
 

модель изображения

 class Image extends Model
{
    use HasFactory;

    protected $fillable = ['product_id', 'file_path'];

}
 

миграция изображений

 class CreateImagesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('images', function (Blueprint $table) {
            $table->id();
            $table->foreignId('product_id')->constrained();
            $table->string('file_path');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('images');
    }
}
 

и это метод внутри моего контроллера продукта, который должен хранить данные

 public function store(Request $request)
    {
        $product = Product::create($request->only('name','price','description'));
        if($images = $request->file('images')){
            foreach($images as $image){
                $image->store('product','public');
                Image::create([
                    'product_id' => $product->id,
                    'file_path' => $image->hashName()
                ]); 
            }
        }
        return $product;
    }
 

когда я тестировал этот метод с почтальоном, я смог сохранить данные в продукте
, но таблица изображений остается пустой, она не получала никаких данных
, никакой помощи!

Комментарии:

1. Вы пробовали вести журнал? Сохранены ли изображения?

2. @KevinBui нет, когда я dd($request->all() показываю всю информацию о продукте и изображении, когда я вручную добавляю данные return Product::with('images')->get(); в запрос get, я получаю продукт с изображением, связанным с ним

Ответ №1:

Используйте следующий код:

 public function store(Request $request)
    {
        $product = Product::create($request->only('name','price','description'));
        if($images = $request->file('images')){
            foreach($images as $image){
                $image->store('product','public');
                $product->images()->create([
                    'product_id' => $product->id,
                    'file_path' => $image->hashName()
                ]); 
            }
        }
        return $product;
    }
 

Комментарии:

1. загрузка изображения не прошла

2. О, извините, я пропустил вызов связи изображений (). Пожалуйста, попробуйте обновить код прямо сейчас

3. $продукт->изображения()->>создать([ ‘product_id’ =>>> $продукт->>>>идентификатор, ‘путь к файлу’ =>>>>> $изображение->>>> > >Хэш-имя() ]);

4. он не был загружен, можете ли вы связаться со мной из этого, чтобы объяснить больше и увидеть полный код , прошло уже два дня

5. Пожалуйста, замените строку 48 в ProductController.php с этой строкой: $product->images()->create([