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

Laravel 根据透视表添加新字段的雄辩查询,laravel,eloquent,Laravel,Eloquent,我试图提出一些有说服力的问题,但无法得到我真正想要的结果。使用Laravel 6 我有下面几张桌子: 表格用户: id | user ============ 1 | Andy id | color ============ 1 | red 2 | blue 3 | white 4 | green 5 | black id | user_id | color_id ========================== 1 | 1 | 1

我试图提出一些有说服力的问题,但无法得到我真正想要的结果。使用Laravel 6

我有下面几张桌子:

表格用户:

id  | user
============
1   | Andy
id  | color
============
1   | red
2   | blue
3   | white
4   | green
5   | black
id  | user_id   | color_id
==========================
1   | 1         | 1
1   | 1         | 4
表格颜色:

id  | user
============
1   | Andy
id  | color
============
1   | red
2   | blue
3   | white
4   | green
5   | black
id  | user_id   | color_id
==========================
1   | 1         | 1
1   | 1         | 4
表格用户\u颜色:

id  | user
============
1   | Andy
id  | color
============
1   | red
2   | blue
3   | white
4   | green
5   | black
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
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
    }
}

有什么想法吗?

有几种方法可以完成这项任务。其中之一可能是在模型中使用附录

附录是可以动态添加到模型类中的属性

例如,您可以这样编辑您的
颜色
型号:

id  | color | active
====================
1   | red   | 1
2   | blue
3   | white
4   | green | 1
5   | black
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
属性

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


参考:

如果
活动属性设置为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;
});

虽然这应该可以达到您需要的结果,但在不知道您要在其中使用它的上下文的情况下,它可能会效率低下。

您希望使用关系或联接查询可以吗?您有这些表的模型吗?如果是这样,请说明您在模型之间建立的关系。那么,您是否想要一个所有颜色的集合,并将单个给定用户选择的颜色标记为活动颜色?或者列出所有颜色以及每个用户的计数?我想是第一个scenario@Hamelraj为了得到一个连接应该是确定的,我只想要一个颜色列表数组。并标记为与轴匹配的活动。这一个听起来很有趣。上下文将显示系统中可用的颜色列表,并将用户已激活并存储在“用户颜色”中的颜色标记为“活动”