2015-09-10 3 views
0

Вот мой код:Как сохранить несколько файлов в базе данных?

ProductController.php

$this->validate($request, [ 'name' => 'required', 'size' => 'required', 'color' => 'required', 'description' => 'required', 'category' => 'required', 'images' => 'required', ]); 

    $id = []; 
    $a = []; 

    for($i = 0; $i < count($input['images']); $i++){ 
     $name = rand(1,1000).'.'.$input['images'][$i]->getClientOriginalExtension(); 
     $path = $input['images'][$i]->move('products/images', $name); 

     $images->name = $name; 
     $images->path = $path; 

     $images->save(); 

     $a[] = $name;  
    } 

    $d = Product::create($input); 
    $d->category()->attach($request->get('category')); 

    $x = []; 

    for($j = 0; $j < count($a); $j++){ 
     $x = $images->where('name', '=', $a[$j])->get(); 
     // $x[] = $a[$j]; 
    } 

    dd($x); 
    // $d->images()->attach($x); 

Images.php

namespace App; 
use Illuminate\Database\Eloquent\Model; 

class Images extends Model { protected $table = 'images'; 

protected $fillable = ['name','path']; 

public function product() 
{ 
    return $this->belongsToMany('App\Product', 'product_images', 'pro_id', 'img_id'); 
} 
} 

product.php

namespace App; 
use Illuminate\Database\Eloquent\Model; 

class Product extends Model { protected $table = 'product'; 

protected $fillable = ['name', 'description', 'size', 'color']; 

public function category() 
{ 
    return $this->belongsToMany('App\Category', 'product_category', 'pro_id', 'cat_id'); 
} 

public function images() 
{ 
    return $this->belongsToMany('App\Images', 'product_images', 'pro_id', 'img_id'); 
} 
} 

Схема

Schema::create('images', function(Blueprint $table){ 
     $table->increments('id'); 
     $table->string('name'); 
     $table->string('path'); 
     $table->timestamps(); 
}); 

Schema::create('product_images', function(Blueprint $table){ 
     $table->integer('pro_id')->unsigned(); 
     $table->integer('img_id')->unsigned(); 

     $table->foreign('pro_id') 
       ->references('id') 
       ->on('product') 
       ->onUpdate('cascade') 
       ->onDelete('cascade'); 

     $table->foreign('img_id') 
       ->references('id') 
       ->on('images') 
       ->onUpdate('cascade') 
       ->onDelete('cascade'); 

     $table->primary(['pro_id', 'img_id']); 
}); 

Теперь, как я могу прикрепить несколько изображений с продуктом? Пожалуйста, дайте мне решение, и если вам нужно что-то изменить, сообщите мне. Спасибо .....

Я обновил к этому коду

$d = Product::create($input); 
     $d->category()->attach($request->get('category')); 

     $a = []; 

     for($i = 0; $i < count($input['images']); $i++){ 
      $name = rand().'.'.$input['images'][$i]->getClientOriginalExtension(); 
      $path = $input['images'][$i]->move('products/images', $name); 

      $images->name = $name; 
      $images->path = $path; 

      $images->save(); 

      $a[] = $images->id; 

     } 

     dd($a); 

     $d->images()->sync($a); 

Теперь, как я могу прикрепить несколько изображений с продуктом? Я получаю только последний идентификатор изображения. Но это должен быть массив идентификаторов из двух или более идентификаторов изображений. Пожалуйста, дайте мне решение, и если вам нужно что-то изменить, сообщите мне. Спасибо.

ответ

0

У вас есть много способов сделать это. Чем проще использовать методы отношений, а затем save().

Вот пример из документации Laravel.

$comment = new App\Comment(['message' => 'A new comment.']); 

$post = App\Post::find(1); 

$comment = $post->comments()->save($comment); 

Если у вас есть много примеров «многие» части отношения, вы можете использовать saveMany().

$post = App\Post::find(1); 

$post->comments()->saveMany([ 
    new App\Comment(['message' => 'A new comment.']), 
    new App\Comment(['message' => 'Another comment.']), 
]); 

Данное решение должно быть идеальным для ваших нужд.

Кроме того, я предлагаю вам переименовать свои модели с помощью единственного числа. Not Фотографии, но Изображение. Будет легче работать с конвенциями.

Больше информации здесь: http://laravel.com/docs/5.1/eloquent-relationships#inserting-related-models

EDIT

О ситуации.

Прежде всего, я хотел бы переместить

$d = Product::create($input); 

прямо перед для цикла.После продукта создания, я бы просто сделать, в вашем для цикла, это:

$d = Product::create($input); 
$imagesIdsArray = []; 

for($i = 0; $i < count($input['images']); $i++){ 
    $name = rand(1,1000).'.'.$input['images'][$i]->getClientOriginalExtension(); 
    $path = $input['images'][$i]->move('products/images', $name); 

    $images = new Image; 

    $images->name = $name; 
    $images->path = $path; 

    $images->save(); 

    $imagesIdsArray[] = $images->id; 
} 

$d->images()->sync($imagesIdsArray); 

Делая это, вы автоматически настройки ваши отношения.

Это

$d->images()->sync($imagesIdsArray); 

является ключом проход.

Надеюсь, это поможет.

+0

Я сохраняю несколько изображений в таблице. Теперь, как я могу прикрепить каждое изображение с продуктом в качестве стиля кода? Пожалуйста, помогите мне узнать. –

+0

Можете ли вы отредактировать свой пост, чтобы показать мне, какая у вас структура таблиц? Спасибо –

+0

@Francesco Malatesta.i также ищу тот же ответ http://stackoverflow.com/questions/32478680/how-to-insert-multiple-data-using-relation-in-laravel – iCoders

Смежные вопросы