【问题标题】:Laravel/Eloquent attach() method bypasses my multitenant traitLaravel/Eloquent attach() 方法绕过了我的多租户特性
【发布时间】:2015-11-26 19:09:58
【问题描述】:

我正在使用 Eloquent attach() 方法将关系数据插入到数据透视表中:

$this->user->roles()->attach($role, ['user_id' => $user]);

上面的行将数据插入到一个数据透视表中,该表在我的应用中链接用户及其角色。

问题是我有一个特征设置,每次执行查询时都会在数据库表中插入一个cust_id 值。当我使用 attach 方法时,永远不会插入 cust_id 值。但是,它适用于所有其他方法,例如 createinsert 等。

我的特征文件:

<?php 

namespace App\Scopes;
use Session;

trait MultiTenantTrait
{
    /**
     * Constructor.
     * 
     * @return void
     */
    public function __construct($attributes = array())
    {
        parent::__construct(array_merge($attributes, ['cust_id' => Session::get('cust_id')]));
    }

    /**
     * Append `cust_id` to all insert statements.
     * 
     * @return void
     */
    public function insert($attributes = array())
    {
        foreach($attributes as $key => $value) 
        {
            $attributes[$key]['cust_id'] = Session::get('cust_id');
        }

        return parent::insert($attributes);
    }

    /**
     * Boot the scope.
     * 
     * @return void
     */
    public static function bootMultiTenantTrait()
    {
        static::addGlobalScope(new MultiTenantScope());
    }

    /**
     * Get all tenants.
     * 
     * @return string
     */
    public static function allTenants()
    {
        return (new static())->newQueryWithoutScope(new MultiTenantScope());
    }
}

问题是我的 trait(上图)中的 insert() 方法没有被触发。有谁知道为什么?

有解决办法吗?

PS - 在你问之前,我在所有模型的顶部都有use MultiTenantTrait

【问题讨论】:

  • 看起来attach 正在使用查询生成器将记录插入到数据透视表中,这是有道理的,因为数据透视表没有自己的模型。这意味着模型上根本没有 insert 方法可以命中,因为没有模型。您可能只需要为这种特殊情况设置一个事件处理程序。
  • 你认为枢轴应该有自己的模型吗?
  • 它可以,但为了让它工作,你需要通过它自己的模型而不是 attach 方法(或你使用的任何其他依赖于 @987654334 的方法来操作表@ 关系)。你真的需要把它放在数据透视表上吗?我不知道您的业务逻辑,但将其放在 usersroles 表上就足够了?
  • @V4n1ll4 尝试为您的数据透视表创建一个模型并使用创建或插入方法而不是附加,这样您的特征应该可以工作。我不明白为什么它不能工作,因为它适用于其他模型。
  • 哦,答案很明显,只需将cust_id 添加到您已经拥有的参数数组中,其中当前包括user_id

标签: php laravel laravel-5


【解决方案1】:

正如我在评论中所说,这是行不通的,因为它取决于insert 被击中。问题是数据透视表没有自己的模型,所以没有insert 方法。

如果您需要将cust_id 插入到数据透视表中,attach 需要一些额外的参数来执行此操作。

$this->user->roles()->attach($role, ['user_id' => $user, 'cust_id' => Session::get('cust_id')]);

【讨论】:

    猜你喜欢
    • 2015-05-18
    • 1970-01-01
    • 2016-02-17
    • 2020-11-27
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    相关资源
    最近更新 更多