选择不在关系表中的记录

时间:2016-11-29 10:04:28

标签: laravel laravel-5.3

我有2个具有这种结构的表:

**table1**
id   |  title
-----+--------
 1   |  Blah1
 2   |  Blah2

**table2**
id   |  table1_id  | article_id
-----+-------------+------------
 1   |   1         |  1
 2   |   1         |  3
 3   |   2         |  1

现在,我想知道如何选择table1中未使用的所有记录table2

例如,我需要table1 table2中不存在的所有article_id=3条记录

如何创建模型并使用雄辩的模型?

更新

我需要Blah2中的table1,然后向我的用户显示,因为之前为Blah1插入了article_id = 3

更新2:

这是有效的查询,我需要为此查询编写模型:

SELECT a.*
FROM table1 AS a
WHERE a.id NOT IN (SELECT table1_id
FROM table2
WHERE article_id = 3
)

1 个答案:

答案 0 :(得分:1)

你需要创建类似下面的模型,你可以适当地改变名称 在这里我会提到如下所示的内容 table1 => ParentModel和table2 => ChildModel

使用以下方法

定义ParentModel中子项的关系
class ParentModel extends Model {
    public function children() {
        return $this->hasMany(ChildModel::class, 'table1_id');
    }
}

whereDoesntHave方法可用于过滤具有相关模型的记录 点击这里https://laravel.com/docs/5.3/eloquent-relationships#querying-relationship-absence

ParentModel::whereDoesntHave('children', function($q){
     // here $q refers to related model in this case ChildModel
     $q->where('article_id', 3); 
})->get();

上面的查询应返回所需的结果。