Gabotronix
3 months ago
239
2
General

Help with many to many realtionship

Posted 3 months ago by Gabotronix

Hi everybody, I'm trying to make an app where airbnb hosts can have a log of their bookings, I created three models: Home, Guest and Booking. Booking being the main player, I also think there should be a pivot table but I'm not sure which models should it link... I decided to go with booking_guest but I'm getting the following error when I create a booking:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'booking_id' cannot be null (SQL: insert into `booking_guest` (`booking_id`, `guest_id`) values (?, 1), (?, 2))

I do something like this in my BookingController:

public function create(Request $request)
    {

        $guestIds = Guest::latest()->take(2)->pluck('id');
        $home = Home::findOrFail(1);

        $booking = new Booking();
        $booking->home_id = $home->id;
        $booking->guests()->attach($guestIds);
        $booking->save();
		
        return response()->json([
			'booking' => $booking,
        ]);
        
    }

I'm not feeling too sure about this configuration, could you guys share some light on me.

These are my models:


class Home extends Model
{
    
    public function guests()
    {
        return $this->belongsToMany('App\Models\Guest', 'guest_home', 'home_id', 'guest_id');
    }

    public function bookings()
    {
        return $this->hasMany('App\Models\Booking');
    }

}


class Booking extends Model
{
    
    public function guests()
    {
        return $this->belongsToMany('App\Models\Guest', 'booking_guest', 'booking_id', 'guest_id');
    }

}

class Guest extends Model
{
    
    public function bookings()
    {
        return $this->belongsToMany('App\Models\Booking', 'booking_guest', 'guest_id', 'booking_id');
    }

}

My migrations:

//Booking guest pivot table
Schema::create('booking_guest', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedInteger('booking_id')->index();
            $table->foreign('booking_id')->references('id')->on('bookings')->onDelete('cascade')->onUpdate('cascade');
            $table->unsignedInteger('guest_id')->nullable()->index();
            $table->foreign('guest_id')->references('id')->on('guests')->onDelete('cascade')->onUpdate('cascade');
            $table->timestamps();
        });

Schema::create('guests', function (Blueprint $table) {
            $table->increments('id');
            $table->string('fullName');
            $table->text('country');
            $table->timestamps();
        });

Schema::create('bookings', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedInteger('home_id')->index();
            $table->foreign('home_id')->references('id')->on('homes')->onDelete('cascade')->onUpdate('cascade');
            $table->timestamp('entryDate')->nullable();
            $table->timestamp('exitDate')->nullable();
            $table->timestamps();
        });

Schema::create('homes', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedInteger('host_id')->index();
            $table->foreign('host_id')->references('id')->on('hosts')->onDelete('cascade')->onUpdate('cascade');
            $table->string('fullAddress')->unique();
            $table->integer('rooms')->unique();
            $table->timestamps();
        });

Please sign in or create an account to participate in this conversation.