1
\$\begingroup\$

I'm trying to create a system to log all bookings for a few airbnb hosts, at first I had two models Home and Guest, where a home can have many guests and a guest could book for many homes,

then I thought about creating a guest_home pivot table to link both tables... then things got complicated in my head, what about a Booking model, and (have that booking model act as a pivot table ?) , to me doing new Booking() seemed better than attaching ids to home model?

How could you guys go about this, it's making my brain malt right now...

I thought of doing something like this in my BookingController:

public function createBooking(Request $request)
    {

        $guestIds = Guest::latest()->take(3)->pluck('id');
        $home = Home::findOrFail($request->input('home_id', 2));

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

Should I create home_guest pivot table, is a pivot table even needed? what models would I link, please bear with me, so far this is what I got:

Models

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

}

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

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

}

class Booking extends Model
{
    //Is Booking needed or I could make a pivot table like home_guest called 'bookings' ?
    public function guests()
    {
        return $this->belongsToMany('App\Models\Guest', 'booking_guest', 'booking_id', 'guest_id');
    }

}

Migrations:

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->unsignedInteger('guest_id')->nullable()->index();
            $table->foreign('guest_id')->references('id')->on('guests')->onDelete('cascade')->onUpdate('cascade');
            $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();
        });

Schema::create('guests', function (Blueprint $table) {
            $table->increments('id');
            $table->string('fullName')->unique();
            $table->string('identificationType')->unique();
            $table->text('country')->nullable();
            $table->timestamps();
        });
```
\$\endgroup\$
1
  • 2
    \$\begingroup\$ Please clarify whether the current code works the way it should or not. Your question is quite unclear. \$\endgroup\$ – Mast Jul 20 '20 at 6:18

Browse other questions tagged or ask your own question.