【问题标题】:How to Query Laravel Eloquent如何查询 Laravel Eloquent
【发布时间】:2019-12-20 03:58:00
【问题描述】:

我是 Laravel 的新手。我对laravel关系有疑问。你们能帮帮我吗?

我有四张桌子:
1. 用户
2. 团队
3. 游戏
4.挑选

Picks 是我的中间表模型
1.id
2.user_id
3.team_id
4.game_id

用户类

class User extends Model
{
  public function picks()
  {
     return $this->hasMany('App\Models\Pick');
  }
}

团队课

class Team extends Model
{
  public function picks()
  {
    return $this->hasMany('App\Models\Pick');
  }
}

游戏类

class Game extends Model
{
   public function picks()
   {
     return $this->hasMany('App\Models\Pick');
   }
}
class Pick extends Model
{
    public function users()
    {
        return $this->belongsToMany('App\Models\User');
    }

    public function teams()
    {
        return $this->belongsToMany('App\Models\Team');
    }

    public function schedules()
    {
        return $this->belongsToMany('App\Models\Schedule');
    }
}

如何将此查询转换为 eloquent?

"SELECT * FROM `games` AS g LEFT JOIN `picks` as p ON p.game_id = g.id LEFT JOIN `users` as u ON u.id = p.user_id WHERE u.id = 1;"

我想通过用户 ID 选择游戏。

【问题讨论】:

  • 模型是你制作的吗?比如你走了多远?
  • @NielsLucas 是的,我已经创建了模型。编辑了我的帖子,抱歉。
  • @LLJ97 是的,但我找不到任何答案

标签: php laravel


【解决方案1】:

您的Pick 模型错误。所有的关系都应该是BelongsTo() 而不是BelongsToMany(),因为选择只属于一个用户、一个团队和一个时间表。

选择模型

class Pick extends Model
{
    public function user()
    {
        return $this->belongsTo('App\Models\User');
    }

    public function team()
    {
        return $this->belongsTo('App\Models\Team');
    }

    public function schedule()
    {
        return $this->belongsTo('App\Models\Schedule');
    }
}

现在,获取属于特定用户的特定 Pick 的游戏。

控制器功能

$userId = '1';

$games = Game::whereHas('picks', function($query) use ($userId) {
    // Here you have a query for picks table.
    $query->where('user_id', $userId);
})
->get();

【讨论】:

    【解决方案2】:

    你几乎是对的。

    您的用户模型关系应该与试图达到的类相匹配,在后台处理的 al 之间的表。

        class User extends Model
    {
      public function games()
      {
         return $this->belongsToMany(Games::class, 'picks'); <-- i prefer this over string
      }
    }
    

    然后在你的控制器中的某个地方你可以这样做

    $user = User::find(1);
    $games = $user->games; <-- should work but if not
    $games = $user->games()->get() <-- has to do with lazy loading.
    

    编辑:我将表格更改为选择关系

    【讨论】:

    • 试过了但还是不行 :( 不过谢谢你的帮助。
    • 是的,我收到一个错误:找不到列:1054 'where 子句'中的未知列'schedules.picks'(SQL:select * from schedules where schedules.picks = 1并且schedules.picks 不为空)
    • 所以这是另一个表的错误,而不是您现在正在尝试的关系。 Pick 更像是一个数据透视表,不应被视为模型。
    • 您是否仍将您的关系引用到 Pick 表?
    • 好的,我明白了。但是 laravel 不支持 3 方式多对多关系。所以我搜索了它并在这里得到了答案stackoverflow.com/questions/30649810/…
    【解决方案3】:

    你正试图跳过桌子。 检查文档:

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

    【讨论】:

    • 他只是想获得 id = 1 的用户的游戏?所以只是多对多。如果正确设置 ``` $user = User::find(1); $user->getGames()
    • 虽然链接可能会有所帮助(如果您正在处理关系并且不想明确地进行查询),您应该将链接的基本信息放在答案本身中。如果链接失效,这个答案就不再有用了
    • 是的,已经尝试过 hasManyHrough,但我的游戏桌没有可供选择的外键。
    猜你喜欢
    • 2017-10-22
    • 1970-01-01
    • 2021-08-27
    • 2021-12-26
    • 2019-02-13
    • 2015-02-22
    • 2017-06-05
    • 1970-01-01
    相关资源
    最近更新 更多