属于Laravel 5中的数据透视表

时间:2017-10-02 10:03:52

标签: php laravel laravel-5 eloquent

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

enter image description here

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

$dogs = Dog::with('walks')->get();
$walks = Walk::with('dogs')->get();

理论上,我可以将dog_owner_id替换为两个单独的列:dog_idowner_id。这样可以很容易地使用Eloquent,但是我会失去一些数据完整性,因为无关的狗和所有者可能会散步(而且这两者都不安全!)。

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

public function dog() {
    // return ???;
}

Dog.php Owner.php 怎么样?

public function walks() {
    // return ???;
}

2 个答案:

答案 0 :(得分: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...
);

答案 1 :(得分:0)

1-创建4个模型(步行,狗,所有者,狗所有者)

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...
    );
   }