Laravel Eloquent Query - 如何使用DISTINCT返回唯一值

时间:2017-01-12 10:39:08

标签: php mysql laravel eloquent laravel-eloquent

我是Laravel和Eloquent的新手,我正在尝试从3个表中检索独特的记录,即橱柜,item_types和pivot cupboard_items。还有第四张位置表。

在MySQL中构建一个工作查询,如下所示(在MySQL工作台上成功测试)。尝试使用DB :: raw('')和DB :: statement(''),但我的IDE发出警告,“没有数据源配置为运行这个SQL并提供高级代码帮助'并且当DB :: statement返回' true'。

时,使用DB :: raw返回一个空对象
SELECT cupboards.cupboard_id, cupboards.name, cupboards.capacity, dist.item_type_id, item_types.name, locations.coordinates FROM cupboards INNER JOIN
(SELECT DISTINCT cupboard_items.item_type_id, cupboard_id FROM cupboard_items) AS dist
ON cupboards.cupboard_id = dist.cupboard_id
INNER JOIN item_types ON dist.item_type_id = item_types.item_type_id
INNER JOIN locations ON locations.location_id = cupboards.location_id;

不确定我的语法是否错误,但后来我也尝试构建一个Eloquent查询

$result = DB::table('cupboards')
            ->select(DB::raw('cupboards.cupboard_id, cupboards.name, cupboards.capacity, dist.item_type_id, item_types.name, locations.coordinates'))
            ->join(DB::raw('SELECT DISTINCT cupboard_items.item_type_id, cupboard_id FROM cupboard_items'))
            ->join('item_types', 'dist.item_type_id', '=', 'cupboard.item_type_id')
            ->join('locations', 'locations.location_id', '=', 'cupboards.location_id')
            ->get();

但显然我不能在我的DB :: raw查询语句中使用DISTINCT,并且不确定我的连接是否正确完成。关于如何从这里开始的任何建议非常感谢!!!谢谢!

2 个答案:

答案 0 :(得分:0)

我认为你不需要这个复杂的查询,我希望你想从橱柜模型中获取值与位置。在橱柜类中定义这些关系,

Cupboard {

public function units()
{
    return $this->belongsToMany('cupboardItem', 'cupboard_items', 'cupboard_id', 'item_type_id');
}

public function location()
{
    return $this->hasOne('location', 'location_id', 'location_id');
}

}

然后做一个,

Cupboard::get();

如果您获得了一些重复记录,

Cupboard::select('cupboards.cupboard_id, cupboards.name, cupboards.capacity, dist.item_type_id, item_types.name, locations.coordinates')->distinct()->get();

答案 1 :(得分:0)

替换以下查询:

    $result = DB::table('cupboards')
        ->select(DB::raw('cupboards.cupboard_id, cupboards.name, cupboards.capacity, dist.item_type_id, item_types.name, locations.coordinates'))
        ->join(DB::raw('SELECT DISTINCT cupboard_items.item_type_id, cupboard_id FROM cupboard_items'))
        ->join('item_types', 'dist.item_type_id', '=', 'cupboard.item_type_id')
        ->join('locations', 'locations.location_id', '=', 'cupboards.location_id')
        ->distinct()
        ->get();