雄辩的查询根据数据透视表添加新字段

时间:2019-12-20 10:00:54

标签: laravel eloquent

我试图用Eloquent进行一些查询,但无法获得我真正想要的结果。使用Laravel 6。

我有以下表格:

表格用户:

id  | user
============
1   | Andy

表格颜色:

id  | color
============
1   | red
2   | blue
3   | white
4   | green
5   | black

表user_colors:

id  | user_id   | color_id
==========================
1   | 1         | 1
1   | 1         | 4

我想要的是一种可以获取所有颜色的东西,但是将这些颜色标记为活动状态。像这样:

id  | color | active
====================
1   | red   | 1
2   | blue
3   | white
4   | green | 1
5   | black

有什么主意吗?

2 个答案:

答案 0 :(得分:1)

这应该返回Color个对象的集合,并将与给定用户相关联的对象与给定的active属性设置为true

$user_colors = User::find(1)->colors;
$colors = Colors::all()->transform(function ($color) use ($user_colors) {
    if ($user_colors->contain($color)) {
        $color->active = true;
    }
    return $color;
});

这虽然可以达到所需的结果,却不知道要使用它的上下文,但是效率可能很低。

答案 1 :(得分:0)

有几种方法可以完成此任务。其中之一可能是在模型中使用追加。

追加是可以动态添加到模型类中的属性。

例如您可以像这样编辑Color模型:

class Color extends Model {

    // Your code...

    protected $appends = ['active'];

    public function getActiveAttribute() {
        $is_active = UserColor::whereColorId($this->id)->first();
        if (!is_null($is_active)) return true; // Or 1, up to you
        return false; // Or 0, up to you
    }
}

如果使用此方法,则可以访问$color->active属性。

请注意,这只是可用于执行此任务的不同方法之一。

参考:Laravel Appends Documentation