Yii2:使用多对多关系的值填充模型字段

脑喂食器

我们正在尝试以用户只能检索与其帐户相关的数据的方式设置REST API。到目前为止,我们只有一个公共API,所有这些都像个魅力一样。公共API仍然会被使用,因此我们从头开始。

我们有一个User模型,可以扩展ActiveRecord和实现IdentityInterface用户将与Customer模型有关系(许多:许多,但至少一个)。用户将拥有only one MASTER客户。以上内容使用3个表保存在数据库中app_customer_usersapp_customers并且link_customer_users_customers连接表包含一个布尔字段master

在用户模型中:

public function getCustomers() {
    return $this->hasMany(Customer::className(), ['id' => 'customer_id'])
        ->viaTable('link_customer_users_customers', ['user_id' => 'id']);
}

在客户模型中:

public function getUsers() {
    return $this->hasMany(User::className(), ['id' => 'user_id'])
        ->viaTable('link_customer_users_customers', ['customer_id' => 'id']);
}

如果我们要求所有客户,这将非常有用,他们将被填充“用户”(如果我们将其添加到extraFields等等,等等...)

新的API用于Basic user:pass身份验证,我们可以通过调用获取当前的用户对象/身份Yii::$app->user->getIdentity()

现在的问题

当用户以一种可以通过调用Yii::$app->user->getIdentity()->customer_idOR获得的方式进行连接时,我们希望能够包含客户ID Yii::$app->user->getIdentity()->getCustomerId()。客户ID应该是联接master表中的ID == true

我们尝试将其添加到中fields,就像我们以前处理hasOne关系时一样,但是在这种情况下,它似乎不起作用:

$fields['customer_id'] = function($model) {
    return $model->getCustomers()->where('link_customer_users_customers.master', true)->one()->customer_id;
}; // probably the where part is our porblem?

我们尝试过创建这样的自定义getter:

public function getCustomerId() {
    return $this->getCustomers()->andFilterWhere(['link_customer_users_customers.master' => true])->one()->customer_id;
}

最后一次尝试导致错误

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'link_customer_users_customers.master' in 'where clause'\nThe SQL being executed was: SELECT * FROM `app_customers` WHERE (`link_customer_users_customers`.`master`=TRUE) AND (`id`='93')

我们一直在文档中和Google上进行搜索,但没有找到有关如何执行此操作的示例。

根据接受的答案,我们添加了一些代码。

User模型中:

// Include customer always with user
public static function findIdentity($id) {
    return static::findOne($id)->with('customer');
}

// Next to `getCustomers()`, added this `hasOne` relation to get only the customer from
// which the current user is the master user
public function getCustomer() {
    return $this->hasOne(Customer::className(), ['id' => 'customer_id'])
        ->viaTable('link_customer_users_customers', ['user_id' => 'id'], function ($query) {
            $query->andWhere(['master' => 1]);
        });
}

// Getter, just because
public function getCustomerId() {
    return $this->customer->id;
}

现在,我们可以通过在项目中调用Yii::$app->user->getIdentity()->customer->idORYii::$app->user->identity->customer->id等来从客户那里获取ID

穆罕默德·奥默·阿斯兰

您应该添加如下所示的关系,并将anonymous函数用作第三个参数,viaTable以添加另一个条件以将master字段检查为true。

public function getMasterCustomerId() {
    return $this->hasOne(Customer::className(), ['id' => 'customer_id'])
    ->viaTable('link_customer_users_customers', ['user_id' => 'id'],function($query){
       $query->andWhere(['master' => 1]);
   });
}

然后可以将其用于登录用户,如下所示。

Yii::$app->user->identity->masterCustomerId->id;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

yii2 activedataprovider 中的多对多关系

如何在Yii2中处理多对多关系

Yii2迁移中的多对多关系

YII2 我如何处理多对多关系?

yii2-多对多关系的CRUD

如何从Grid Yii2搜索模型中的许多关系中获得计数

yii2在多对多关系上添加“ 0 = 1”以进行查询

如何删除yii2中的多对多关系(数据透视表)

我如何从表中获取与yii2中多对多关系的数据?

Yii2:模型“字段”忽略空值

Django模型错误:可以使用此多对多关系之前的字段x

如何在同一模型上强制使用多对多关系进行字段映射

如何使用与 Django Rest Framework 中的中间模型的多对多关系序列化附加字段?

在 Django 中访问多对多关系中的模型字段

yii2模型查找与关系

使用值列表过滤多对多关系

Yii 2对联结表中的值过滤多对多关系

Yii2从相关多对多模型中选择某些字段

递归与Yii的多对多关系

Yii多对多关系查询

在Yii2中建立一对多关系

ValueError:“在使用此多对多关系之前,需要具有字段“ id”的值”

在使用此多对多关系之前,“ <消息:标题>”必须具有字段“ id”的值。

Django-在使用这种多对多关系之前,需要具有字段“ id”的值

<News:somethinng>”必须具有字段“ id”的值,然后才能使用这种多对多关系

ValueError:变量需要具有字段“id”的值才能使用这种多对多关系 - Django

在使用这种多对多关系之前,django use mixin 需要有字段“id”的值

使用ID而不是对象填充SQLAlchemy多对多关系

如何使用Yii2将模型数据和关系模型导出到json?