Laravel关系不在哪里

时间:2019-11-13 14:03:53

标签: php laravel laravel-5 eloquent laravel-4

我有下表

用户

id | username | password

1 | scott | 98746
2 | mark | 6542
3 | michel | 6589

用户详细信息

id | user_id | status | mobile_number 

1 | 1 | pending | 987643210

2 | 2 | review | 3216547901

现在我要检索user_detail表中status=pending

中用户没有记录的那些记录

我尝试使用最新版本的关系

$user=User::with('userDetail')

        ->whereDoesntHave('userDetail',function ($query){

             $query->where('status','pending');
        })->get();

我在laravel中寻找没有关系的逻辑。由于我们使用的是不支持的旧laravel版本。

2 个答案:

答案 0 :(得分:1)

我不知道您之间的关系是什么意思,但是如果您必须使用普通SQL来执行查询,查询将如下所示:

$qry = "SELECT * FROM users WHERE id not in (SELECT u.id FROM users u INNER JOIN user_details d ON (u.id = d.user_id AND d.status = 'pending'));"

然后您可以通过调用以下命令来运行查询:

$results = DB::select($qry);

PS:由于我无法在旧文档中找到它,因此DB::select()可能需要第二个参数。如果是这种情况,只需将null作为第二个参数即可。

编辑: 我不确定这是否行得通,并且由于它是旧版本,所以我无法对其进行测试,但是类似的事情应该可以工作:

$rest = User::whereNotIn('id', function($q){
    $q->select('user_id')->from('user_detail')->where('status','pending');
});

答案 1 :(得分:1)

我相信您可以通过使用左联接来做到这一点,就像这样:

$rest = DB::table('users')
        ->leftJoin('userDetail','users.id','=','userDetail.user_id')
        ->whereNull('userDetail.id')
        ->orWhere('userDetail.status','=','pending')
        ->get();

如果您需要大量用户,则可以使用hydrate方法,如下所示:

$rest = User::hydrate(DB::table('users')
        ->leftJoin('userDetail','users.id','=','userDetail.user_id')
        ->whereNull('userDetail.id')
        ->orWhere('userDetail.status','=','pending')
        ->select('users.*')
        ->get()->toArray());

欢呼!