我正在开发一个应用程序,其中多个公司可以创建自己的帐户并将其用作自己的帐户。每家公司都可以为自己的公司创建多个用户。每家公司都可以访问自己的数据而不是其他。因此,我在每个表中都有一个company_id
列,许多表也有user_id
列。为了插入company_id
和user_id
,我必须在每个商店方法中手动提供它们:
$request['company_id'] = Auth::user()->company_id;
$request['user_id'] = Auth::user()->id;
Land::create($request->all());
我也必须在模型中提到两个列。
$fillable = ['company_id','user_id','other_column','more_column'];
我想在表格中插入任何数据时自动在数据库中插入当前公司ID和当前用户ID的值。
有没有办法做到这一点?
答案 0 :(得分:0)
一种常见的方法是开发一组类,用于为当前连接到您的应用程序的公司和用户建模。然后,您可以将当前公司ID和用户ID封装在类代码中,并将数据库操作封装在同一个类中。这样那些id将始终作为类变量使用。
另一个创造性的解决方案是在打开与数据库的连接时设置MySQL user-defined session variables。您可以在表上开发触发器以填充公司ID和用户ID。
CREATE TRIGGER defaults_on_insert BEFORE INSERT ON SomeTable
FOR EACH ROW SET NEW.company_id = @company_id, NEW.user_id = @user_id;
但这似乎有点冒险。如果数据库连接断开并且必须重新连接,则代码必须重新建立会话变量。它也与表示数据库对象的典型客户端对象不兼容,因为没有明确的方法可以通知客户端对象有关触发器填充的值。
最重要的是,您可能最好只是确保在创建新行时提供公司ID和用户ID。