【问题标题】:Belongs to pivot table in Laravel 5属于 Laravel 5 中的数据透视表
【发布时间】:2019-06-19 20:41:59
【问题描述】:

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

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

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

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

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

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

Dog.phpOwner.php 怎么样?

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

【问题讨论】:

  • 我相信您正在寻找HasManyThrough。我可能已经离开了,因为我已经有一段时间没有做任何与 laravel 相关的事情了。
  • 我认为 hasManyThrough 对 Dog.php 和 Owner.php 有效,但不确定 Walk.php。
  • 我想你可以只使用老式的连接,如果没有别的。看看here
  • 我在这篇文章中也有类似的经历:stackoverflow.com/questions/44720436/… 但我相信 eloquent 没有什么标准可以解决这个问题。如果它存在的话,我很想看到这样的东西。
  • 如果这是你的真实结构,那么walks 与数据透视表相关似乎很奇怪。它是某种数据透视表 - owner + dog = walk,不是吗?

标签: php laravel laravel-5 eloquent


【解决方案1】:

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

【讨论】:

  • 好吧,当我们在 Laravel 中有 PivotModel 时,现在更容易实现。这些天我用另一种方式做,今天我只是把dog_idowner_id放到walks表中。
  • 当关系多对多时,例如(authors、posts、author_post),数据透视表可以正常工作,但在 walk 表中,关系是通过数据透视表和 (dog,owner) 表中的一对一关系通过数据透视表一对多
  • 我相信这可能会有所帮助。它确实解决了我的问题。 laravel.io/forum/…
【解决方案2】:

正如其他人提到的,您可以为此使用 HasManyThrough:

https://laravel.com/docs/5.5/eloquent-relationships#has-many-through

正如您所说,这对您的 Dog 和 Owner 模型有效。对于您的 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...
);

【讨论】:

  • 你确定吗?每次散步只有一只狗和一个主人(至少在我的世界里:P)。
  • 好的,所以你定义了 2 个方法。
  • 我的意思是,hasManyThrough 旨在查询多条记录,而不是一条。
  • 我真诚地怀疑是否有 standard way 雄辩地完成这项工作。
  • 另外,在这种情况下,我需要根据枢轴制作一个假模型,例如DogOwnerPair
猜你喜欢
  • 2015-01-10
  • 2015-09-10
  • 2016-03-09
  • 2015-09-21
  • 1970-01-01
  • 2018-08-18
  • 2018-04-10
  • 1970-01-01
  • 2016-06-14
相关资源
最近更新 更多