Rob*_*bok 6 php laravel eloquent laravel-5
假设我有以下数据库架构:
dogs
并owners
与经典连接belongsToMany
。怎么样的walks
表?我希望能够在这种关系中使用 Eloquent 的好东西:
$dogs = Dog::with('walks')->get();
$walks = Walk::with('dogs')->get();
Run Code Online (Sandbox Code Playgroud)
理论上,我可以dog_owner_id
用两个单独的列替换:dog_id
和owner_id
。这将使使用 Eloquent 变得容易,但我会失去一些数据完整性,因为不相关的 Dog 和 Owner 可能会去散步(这对两者都不安全!)。
在Walk.php 中,应该如何定义关系?
public function dog() {
// return ???;
}
Run Code Online (Sandbox Code Playgroud)
如何Dog.php和Owner.php?
public function walks() {
// return ???;
}
Run Code Online (Sandbox Code Playgroud)
小智 6
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...
);
}
Run Code Online (Sandbox Code Playgroud)
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...
);
}
Run Code Online (Sandbox Code Playgroud)
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...
);
}
Run Code Online (Sandbox Code Playgroud)
正如其他人提到的,您可以使用 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...
);
Run Code Online (Sandbox Code Playgroud)