Laravel / Eloquent attach()方法绕过了我的多租户特征

时间:2015-09-01 13:51:20

标签: php laravel laravel-5

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

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

以上行将数据插入到我的应用中链接用户及其角色的数据透视表中。

问题是我有一个特征设置,每次执行查询时都会在数据库表中插入cust_id值。当我使用cust_id方法时,attach值永远不会被插入。但是,它适用于所有其他方法,例如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());
    }
}

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

有解决方法吗?

PS - 在您提出要求之前,我use MultiTenantTrait位于所有模型的顶部。

1 个答案:

答案 0 :(得分:2)

正如我在评论中所说,这不起作用,因为它取决于insert受到重创。问题是数据透视表没有自己的模型,因此没有insert方法。

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

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