如何在laravel 5.2中执行多对多的雄辩关系?

时间:2016-06-14 19:16:46

标签: php laravel-5 eloquent has-many-through relationships

鉴于以下表格结构:

table users
  - id
  - name

table group_user
  - id
  - group_id
  - user_id

table groups
  - id
  - name

table events
  - id
  - name
  - group_id

我们可以看到UserEvent个对象有关系,但它必须通过UserGroup的多对多关系

我不确定这叫做什么样的关系...这是有多少多对多,因为它有很多Event对象通过users-group_user-groups的多对多关系?

在任何情况下,我如何为此撰写Laravel查询?

1 个答案:

答案 0 :(得分:0)

鉴于$id是执行调用的用户的ID,我们要查找的SQL查询如下所示:

SELECT * FROM events WHERE group_id IN (
    SELECT group_id FROM group_user WHERE user_id = $id
);

因此,如果在您的group_user表格中,我们发现user_id = 1的用户具有以下群组关系group_id = [1, 2, 3, 4, 5],则生成的查询如下所示:SELECT * FROM events WHERE group_id IN [1, 2, 3, 4, 5];我们正在寻找什么(与这些团体有关的事件)。

  1. 打开vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
  2. hasMany方法后插入以下代码。

        /**
         * Define a many-through-many relationship.
         *
         * @param  string  $related
         * @param  string  $through
         * @param  string  $pivotTable
         * @param  string  $pivotKey
         * @param  string  $pivotThroughKey
         * @param  string|null  $firstKey
         * @param  string|null  $secondKey
         * @return \Illuminate\Database\Eloquent\Relations\HasManyThrough
         */
         public function manyThroughMany($related, $through, $pivotTable, $pivotKey, $pivotThroughKey, $firstKey = null, $secondKey = null)
         {
             $relatedModel = new $related; // App\Event
             $relatedTable = $relatedModel->getTable(); // events
    
             $firstKey = $firstKey ?: $this->getForeignKey(); // event_id
    
             $throughModel = new $through; // App\Group
             $throughTable = $throughModel->getTable(); // groups
    
             $secondKey = $secondKey ?: $throughModel->getForeignKey(); // group_id
    
             return $relatedModel
                 ->whereIn($secondKey, function ($query) use ($pivotTable, $pivotKey, $pivotThroughKey)
                 {
                     return $query
                             ->from($pivotTable)
                             ->where($pivotKey, '=', $this->id)
                             ->select($pivotThroughKey);
                 })
                 ->select($relatedTable . '.*');
          }
    
  3. 现在为你的模特。要使用many-through-many关系,请转到User模型并添加以下内容。

        public function events()
        {
            return $this->manyThroughMany('App\Event', 'App\Group', 'group_user', 'user_id', 'group_id');
        }
    
  4. 参数如下:

    1. 您感兴趣的目标模型的名称(即App\Event)。
    2. 您需要传递的辅助模型的名称(即App\Group)。
    3. 数据透视表的名称(即group_user)。
    4. 引用当前模型的数据透视表键(即user_id)。
    5. 引用辅助模型的数据透视表键(即group_id)。
    6. 免责声明

      我真的不知道是否存在诸多关系这样的事情,或者它的名称是什么。这只是对我有用的代码,所以我想与那些可能和我一样陷入困境的人分享。

      如果有更简单的方法,请回答!如果有什么我可以改进,请评论。感谢。