属于 Laravel 5 中的数据透视表

Rob*_*bok 6 php laravel eloquent laravel-5

假设我有以下数据库架构:

在此处输入图片说明

dogsowners与经典连接belongsToMany。怎么样的walks表?我希望能够在这种关系中使用 Eloquent 的好东西:

$dogs = Dog::with('walks')->get();
$walks = Walk::with('dogs')->get();
Run Code Online (Sandbox Code Playgroud)

理论上,我可以dog_owner_id用两个单独的列替换:dog_idowner_id。这将使使用 Eloquent 变得容易,但我会失去一些数据完整性,因为不相关的 Dog 和 Owner 可能会去散步(这对两者都不安全!)。

Walk.php 中,应该如何定义关系?

public function dog() {
    // return ???;
}
Run Code Online (Sandbox Code Playgroud)

如何Dog.phpOwner.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)


Ste*_*n-v 0

正如其他人提到的,您可以使用 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)