Как я могу вставить в laravel сводную таблицу? - PullRequest
0 голосов
/ 11 января 2020

У меня есть 3 таблицы:

stations (id,station_name) 
products (id,product_name)
product_station (station_id,product_id)

Модель станции

protected $fillable = ['station_name'];
public function products(){
        return $this->belongsToMany(Product::class);
    }

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

 protected $fillable = ['product_name'];

public function stations(){
    return $this->belongsToMany(Station::class);
}

Я уже вставил станции и продукты и хочу вставить станцию ​​с собственным продуктом, используя таблицу Pivot

AdminProductStationcontroller

public function create()
    {
        $station = Station::pluck('station_name','id')->all();

        $products = Product::pluck('product_name','id')->all();

        return view('admin.product_stations.create',compact('station','products'));
    }

Я думаю, что есть ошибка в функции магазина ниже

    public function store(Request $request)
    {

        $station = new Station();

        $product = new Product();

        $station->save();

        $station->products()->attach($product);

        return redirect('/admin/product_stations');
     }

Итак, я получил эту ошибку

(2/2) QueryException SQLSTATE [23000]: нарушение ограничения целостности: 1048 Столбец 'product_id' не может быть пустым (SQL: вставить в product_station (product_id, station_id) значения (, 25))

Ответы [ 3 ]

2 голосов
/ 11 января 2020

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

То, что вы ищете, - это метод save(Model).

$station->products()->save($product);

Подробнее об этом в документации: https://laravel.com/docs/5.8/eloquent-relationships#updating -много-ко-многим-отношениям

1 голос
/ 13 января 2020
// Post Model
public function categories()
    {
        return $this->belongsToMany('App\Category')->withTimestamps();
    }
    public function tags()
    {
        return $this->belongsToMany('App\Tag')->withTimestamps();
    }

public function store(Request $request)
    {
        $this->validate($request,[
            'title' =>'required',
            'image' => 'mimes:jpeg,jpg,bmp,png',
            'categories' => 'required',
            'tags' => 'required',
            'body' => 'required',
            'live_demo' =>'required'
        ]);

          $image = $request->file('image');
        $slug = str_slug($request->title);
        if (isset($image))
        {
            $currentDate = Carbon::now()->toDateString();
            $imagename = $slug.'-'.$currentDate.'-'. uniqid() .'.'. $image->getClientOriginalExtension();
            $image_resize = Image::make($image->getRealPath());   
            $image_resize->resize(1600,1066);
            if (!file_exists('storage/uploads/post'))
            {
                mkdir('storage/uploads/post',0777,true);
            }
            //$image->move('storage/uploads/post',$imagename);
            $image_resize->save('storage/uploads/post/'.$imagename);
        }else{
            $imagename = "default.png";
        }

         $post = new Post();
        $post->user_id = Auth::id();
        $post->title = $request->title;
        $post->slug = str_slug($request->title);
        $post->image = $imagename;
        $post->body = $request->body;
        $post->price = $request->price;
        $post->live_demo = $request->live_demo;
        if(isset($request->status))
            {
                $post->status =true;
            }else
            {
                $post->status = false;
            }
        $post->is_approved = true;
        $post->save();
        $post->categories()->attach($request->categories);
        $post->tags()->attach($request->tags);

        Toastr::success('Post Successfully Save:)','Success');
        return redirect()->route('admin.post.index');
    }

// Pivot table create category_post column create   category_id, post_id.
// Pivot table create post_tag, and column create post_id, and tag_id
1 голос
/ 11 января 2020

Сначала вы должны сохранить

$station = new Station();
$station->save();

$product = new Product();
$product->save();

, затем https://laravel.com/docs/6.x/eloquent-relationships#updating -много-ко-многим-отношениям

$station->products()->attach($product->id);

ИЛИ

Вы можете попытаться сохранить как так

$station->products()->save($product);
...