Laravel加入两个表以排除记录

时间:2018-07-29 22:51:14

标签: php laravel join

在Laravel中,如何基于与该表具有关系的表之一的值拒绝查询中的记录?

例如,我有“产品”表和“类别”表。类别表具有一对多关系,一个类别可以具有许多产品。类别表为is_visible is_deleted。如何在“产品”表上进行查询,以使其拒绝属于并具有is_visible = false或is_deleted = true字段类别的产品?

我尝试过这样的事情:

    $products = ProductTable::join('product_category_tables', 'product_category_tables.id', '=', 'product_tables.id')
        ->where('product_category_tables.is_visible', '=', true)
        ->where('product_category_tables.is_deleted', '=', false)
        ->where('product_tables.is_visible', '=', true)
        ->where('product_tables.is_deleted', '=', false)
        ->paginate(50);

但是从这个查询中我只有一条记录。我无法在“类别”表上进行此查询,因为我只希望获得25/50/100的分页产品。

1 个答案:

答案 0 :(得分:0)

如果您正在使用Laravel Modal(Eloquent),并且已经在ProductCategory模型中正确定义了一对多关系。那么您可以通过以下查询来实现:

$products = Product::where("is_visible", true)
                ->where("is_deleted", false)
                ->whereHas('category', function($categories){
                   $categories->where("is_visible", true)
                               ->where("is_deleted", false);
                })
                ->get();

Product模型中,您应将关系定义为以下波纹:

public function category()
{
    //From your mentioned query I am seeing that 
    //product table's id is actually categories table's id(which should not be like this though), 
    //so the relationship is
    return $this->belongsTo(Category::class, 'id');
}