从一个表中选择 Laravel 5.1 中另一个表中不存在的所有记录

Posted

技术标签:

【中文标题】从一个表中选择 Laravel 5.1 中另一个表中不存在的所有记录【英文标题】:Select all records from one table that do not exist in another table in Laravel 5.1 【发布时间】:2015-11-26 11:41:25 【问题描述】:

我想从 Laravel 5.1 中其他表中不存在的表中获取所有记录。

我知道如何在核心 php 中执行此操作,并且可以使用以下代码正常工作

SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL

模型

public function audiences() 
 
return $this->belongsTo('App\BridalRequest', 'request_id'); 

但是当我尝试使用以下代码在 Laravel 中做同样的事情时,

$all_bridal_requests_check = \DB::table('bridal_requests')
                    ->where(function($query)
                    
                        $query->where('publisher', '=', 'bq-quotes.sb.com')
                              ->orWhere('publisher', '=', 'bq-wd.com-bsf');
                    )
                    ->whereNotIn('id', function($query)  $query->table('audiences')->select('request_id'); )
                    ->orderBy('created_on', 'desc')
                    ->get();

然后它给了我这个错误

调用未定义的方法 Illuminate\Database\Query\Builder::table()

【问题讨论】:

你在模型类中定义了关系吗? 能否提供模型类代码? 好的,这里是... public function Audiences() return $this->belongsTo('App\BridalRequest', 'request_id'); 试试这个: public function Audiences() return $this->belongsTo('App\BridalRequest', 'request_id', 'id'); 【参考方案1】:

上述查询可以通过以下方式使用 laravel 查询构建器构建。

SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL

这相当于使用 Laravel 的查询构建器构建的以下查询。

\DB::table('table1 AS t1')
->select('t1.name')
->leftJoin('table2 AS t2','t2.name','=','t1.name')
->whereNull('t2.name')->get();

【讨论】:

【参考方案2】:

晚了,但是我想补充一下这个问题。通过在users模型文件中编写以下代码来创建表之间的laravel eloquent关系,

public function mu_user()

  return $this->hasMany(\App\MainUser::class, 'id');
 

现在从用户表中获取所有没有主要用户的记录,如下所示,

$users = Users::doesnthave('mu_user')->get();

如果您想获取拥有 main_users 的用户,那么您可以编写如下查询,

$users = Author::has('mu_user')->get();

就这么简单。希望对您有所帮助!

【讨论】:

救命稻草,我完全没有在 Laravel 文档中看到这一点。非常感谢

以上是关于从一个表中选择 Laravel 5.1 中另一个表中不存在的所有记录的主要内容,如果未能解决你的问题,请参考以下文章

如何根据laravel控制器中另一个表中保存的数据创建触发器以填充数据库中的表

如何从 Laravel 5.1 中的表而不是“用户”表中对用户进行身份验证?

使表的显示依赖于 Interface Builder 中另一个表中的选择

从表中选择所有行并仅将不同的值插入到 C# 中另一个位置的数据库中

如何从 SQL Server 2005 中另一个表中的相应数据更新一个表中的数据

使用mySQL中另一个表中的select结果更新表中的字段