With this in mind we will be having difficulty especially if we are using Laravel eager loading style as stated in stackoverflow.
In order to have that peace of mind when loading fields it is safer to create a different id key for different table. This is how to go with that approach.
For our parent migration script we have
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateAuthorsTable extends Migration
{
public function up()
{
Schema::create('authors', function (Blueprint $table) {
$table->bigIncrements('au_id');
$table->string('name');
$table->timestamp('birth_date');
$table->unsignedBigInteger('au_st_id');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('authors');
}
}
For our child table, we will have
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateBooksTable extends Migration
{
public function up()
{
Schema::create('books', function (Blueprint $table) {
$table->bigIncrements('bk_id');
$table->unsignedBigInteger('bk_au_id');
$table->string('title');
$table->timestamp('published_date')->nullable();
$table->timestamps();
$table->foreign('bk_au_id')->references('au_id')->on('authors')->onDelete('cascade');
});
}
public function down()
{
Schema::dropIfExists('books');
}
}
To complete the migration script for address
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateAuthorAddressesTable extends Migration
{
public function up()
{
Schema::create('author_addresses', function (Blueprint $table) {
$table->bigIncrements('aud_id');
$table->unsignedBigInteger('aud_au_id');
$table->string('city')->nullable();
$table->string('address')->nullable();
$table->timestamps();
$table->foreign('aud_au_id')->references('au_id')->on('authors')->onDelete('cascade');
});
}
public function down()
{
Schema::dropIfExists('author_addresses');
}
}
This is how to define the relationship that an Author can write 1 or more books. The relationship also shows that he lives in just one (1)address at a time
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Author extends Model
{
protected $primaryKey = 'au_id';
public function books(): HasMany
{
return $this->hasMany('App\Book', 'bk_au_id', 'au_id');
}
public function address(): HasOne
{
return $this->hasOne('App\AuthorAddress','aud_au_id','au_id');
}
}
This is to define that a book belongs to an author
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Book extends Model
{
protected $primaryKey = 'bk_id';
public function author(): BelongsTo
{
return $this->belongsTo('App\Author', 'bk_au_id', 'au_id');
}
}
0 comments:
Post a Comment