Php 不在其中的拉维关系
我有下表 用户Php 不在其中的拉维关系,php,laravel,laravel-5,eloquent,laravel-4,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\u detail表中没有记录的记录,其中status=pending 我尝试在最新版
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\u detail
表中没有记录的记录,其中status=pending
我尝试在最新版本中使用关系
$user=User::with('userDetail')
->whereDoesntHave('userDetail',function ($query){
$query->where('status','pending');
})->get();
我在laravel中寻找没有关系的相同逻辑。因为我们使用的是不支持的旧laravel版本。我不知道没有关系是什么意思,但如果必须使用纯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');
});
我不知道你所说的没有关系是什么意思,但如果你必须使用纯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');
});
我相信您可以通过使用左连接来实现这一点,例如:
$rest = DB::table('users')
->leftJoin('userDetail','users.id','=','userDetail.user_id')
->whereNull('userDetail.id')
->orWhere('userDetail.status','=','pending')
->get();
$rest = User::hydrate(DB::table('users')
->leftJoin('userDetail','users.id','=','userDetail.user_id')
->whereNull('userDetail.id')
->orWhere('userDetail.status','=','pending')
->select('users.*')
->get()->toArray());
如果您需要有说服力的用户集合,您可以使用如下方法:
$rest = DB::table('users')
->leftJoin('userDetail','users.id','=','userDetail.user_id')
->whereNull('userDetail.id')
->orWhere('userDetail.status','=','pending')
->get();
$rest = User::hydrate(DB::table('users')
->leftJoin('userDetail','users.id','=','userDetail.user_id')
->whereNull('userDetail.id')
->orWhere('userDetail.status','=','pending')
->select('users.*')
->get()->toArray());
干杯 我相信您可以通过使用左连接来实现这一点,例如:
$rest = DB::table('users')
->leftJoin('userDetail','users.id','=','userDetail.user_id')
->whereNull('userDetail.id')
->orWhere('userDetail.status','=','pending')
->get();
$rest = User::hydrate(DB::table('users')
->leftJoin('userDetail','users.id','=','userDetail.user_id')
->whereNull('userDetail.id')
->orWhere('userDetail.status','=','pending')
->select('users.*')
->get()->toArray());
如果您需要有说服力的用户集合,您可以使用如下方法:
$rest = DB::table('users')
->leftJoin('userDetail','users.id','=','userDetail.user_id')
->whereNull('userDetail.id')
->orWhere('userDetail.status','=','pending')
->get();
$rest = User::hydrate(DB::table('users')
->leftJoin('userDetail','users.id','=','userDetail.user_id')
->whereNull('userDetail.id')
->orWhere('userDetail.status','=','pending')
->select('users.*')
->get()->toArray());
干杯 如果不希望用户拥有用户详细信息记录,如何检查用户详细信息字段?它没有意义。@MEDZ.yes,因为它有许多逻辑,所以为了保持简单,我发布了小版本show
userDetail
relationcode.@Styx。Martin Dimitrov已经给出了一个完美的答案,但我正在寻找一个有说服力的方法如果你不希望用户有用户详细信息记录,你如何检查用户详细信息字段?它没有意义。@MEDZ.yes,因为它有许多逻辑,所以为了保持简单,我发布了小版本showuserDetail
relationcode.@Styx。马丁·迪米特罗夫已经给出了完美的答案,但我正在寻找有说服力的答案way@Martin.do你知道我是如何通过使用eloquent@vision尝试编辑。请注意,即使这样做有效,也可能有更好的方法。第一种方法应该更有效,tbh.@Martin.这样我已经试过了,不管怎样,谢谢你的努力什么方法不起作用?是否有错误?是否没有错误,但在单个查询中查找是否可以像在raw中编写一样query@Martin.do你知道我是如何通过使用eloquent@vision尝试编辑。请注意,即使这样做有效,也可能有更好的方法。第一种方法应该更有效,tbh.@Martin.这样我已经试过了,不管怎样,谢谢你的努力什么方法不起作用?是否有错误?是否没有错误,但在单个查询中查找是否可以像在raw中编写一样query@leopinzon.Thank you@leopinzon.Thank你