其中查询相关表

时间:2015-10-08 06:12:50

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

我一直在尝试查询,我想在相关表上进行一些验证。我想用Laravel 5做这样的事情

select
  * 
from 
  table1 
    INNER JOIN table3 on(table1.id = table3.table1_id) 
    INNER JOIN table2 on(table1.id = table2.table1_id) 
where 
  table2.column2 in ('arr1', 'arr2');

另外table1与5-7个表相关,我想急切加载所有这些。这是我到目前为止所做的事情

$reports = Table1::with(
        [
            'table3',
            'table4',
            'table5.table6',
            'table7',
            'table8',
        ])
        ->where('created_at', '>=', date('Y-m-d', strtotime($request->get('from'))))
        ->where('created_at', '<', date('Y-m-d', strtotime($request->get('to'))))
        ->with('table2',function($query) use($table1_column){
                return $query->whereIn('table1_column',$table1_column);
        });

但这显示了一切。甚至表2中不存在的项目。我想要实现的是创建一个结果,其中所有项目是table2中存在的唯一项目。表示使用table2中的项目进行的所有事务。 假设table2中的项目的id为123,456和789,那么我想显示与此id的所有相关的记录

如何制作此类结果

1 个答案:

答案 0 :(得分:1)

您可以使用whereHas方法。

$reports = Table1::with(
    [
        'table3',
        'table4',
        'table5.table6',
        'table7',
        'table8',
    ])
    ->whereHas('table2', function($query) use($table1_column){
            return $query->whereIn('table1_column',$table1_column);
    })
    ->where('created_at', '>=', date('Y-m-d', strtotime($request->get('from'))))
    ->where('created_at', '<', date('Y-m-d', strtotime($request->get('to'))));

请注意,这不包括结果集中的表2数据。如果需要,请在with方法调用中包含table2关系名称。