[英]Belongs to pivot table in Laravel 5
假設我有以下數據庫模式:
dogs
和owners
與經典的belongsToMany
。 walks
桌怎么樣? 我希望能夠在這種關系中使用雄辯的好東西:
$dogs = Dog::with('walks')->get();
$walks = Walk::with('dogs')->get();
理論上,我可以用兩個單獨的列替換dog_owner_id
: dog_id
和owner_id
。 這樣可以很容易地使用Eloquent,但是我會丟失一些數據完整性,因為無關的狗和所有者可能會去散步(這對兩者都不安全!)。
在Walk.php中 ,如何定義關系?
public function dog() {
// return ???;
}
Dog.php和Owner.php怎么樣 ?
public function walks() {
// return ???;
}
正如其他人所提到的,你可以使用HasManyThrough:
https://laravel.com/docs/5.5/eloquent-relationships#has-many-through
就像你說的那樣,這對你的狗和主人模特有效。 對於Walk模型,它有點不同,但您可以自己映射查詢:
return $this->hasManyThrough(
'App\Post',
'App\User',
'country_id', // Foreign key on users table...
'user_id', // Foreign key on posts table...
'id', // Local key on countries table...
'id' // Local key on users table...
);
1-創建4個模型(Walk,Dog,Owner,DogOwner)
2-在Walk.php模型中
public function dog()
{
return $this->hasOneThrough(
'App\Models\Dog',
'App\Models\DogOwner',
'id', // Local key on dog_owner table...
'id', // Local key on dogs table...
'dog_owner_id', // Foreign key on walks table...
'dog_id' // Foreign key on dog_owner table...
);
}
public function owner()
{
return $this->hasOneThrough(
'App\Models\Owner',
'App\Models\DogOwner',
'id', // Local key on dog_owner table...
'id', // Local key on owners table...
'dog_owner_id', // Foreign key on walks table...
'owner_id' // Foreign key on dog_owner table...
);
}
3在Dog.php模型中
public function walks()
{
return $this->hasManyThrough(
'App\Models\Walk',
'App\Models\DogOwner',
'dog_id', // Foreign key on dog_owner table...
'dog_owner_id', // Foreign key on walks table...
'id', // Local key on dogs table...
'id' // Local key on dog_owner table...
);
}
4-在Owner.php模型中
public function walks()
{
return $this->hasManyThrough(
'App\Models\Walk',
'App\Models\DogOwner',
'owner_id', // Foreign key on dog_owner table...
'dog_owner_id', // Foreign key on walks table...
'id', // Local key on owners table...
'id' // Local key on dog_owner table...
);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.