首页 > 解决方案 > 创建自定义关系?

问题描述

模型user 可能有 0 个或多个foo,也可能有 0 个或多个bar。这是一个图表:

在此处输入图像描述

有以下规则:如果用户有任何 bar,那么这意味着他有 foo id=1。如果没有 bar,用户可能没有 foo id=1foo_user为了防止数据库不一致,永远不会在with中插入一行foo_id = 1,因为它已经被表暗示了bar_user

在 Laravel 中,我可以foo从这样的用户那里得到 all :

public foos()
{
    $this->belongsToMany('App\Foo');
}

问题是由于上述规则,foowithid = 1可能会丢失。有没有一种简单的方法来自定义我的关系方法foos,以便它检查,如果bar_user存在,然后添加foowith id=1?我想通过一个查询和关系获得正确的 foo,所以我可以像这样使用它\App\User::whereHas('foos', ...)


这是我尝试过的

获取 all 的查询foo

  \DB::table('foos')
          ->leftjoin('foo_user', 'foo.id', 'foo_user.foo_id')
          ->where('foo_user.user_id', '=', $this->id);
          ->orWhereRaw('EXISTS (select * from bar_user WHERE user_id = ?) AND foos.id = 1', [$this->id]);

我不能做

public foos()
{
    $this->belongsToMany('App\Foo')
         ->orWhereRaw('EXISTS (select * from bar_user WHERE user_id = ?) AND foos.id = 1', [$this->id]); 
}

因为有一个innerjoininbelongsToMany而不是一个leftjoin.

标签: mysqllaravel-5eloquent

解决方案


推荐阅读