带有变量的 Laravel 模型表名

Posted

技术标签:

【中文标题】带有变量的 Laravel 模型表名【英文标题】:Laravel Model's table name with variable 【发布时间】:2016-03-05 20:21:08 【问题描述】:

我想根据哪个用户是 Auth 来更改表名。

为什么?因为当我添加一个dealer时,我为这个dealer创建了一个数据库客户端,数据的名字是d.$dealer_id.clients。因此,用户需要将客户添加到与自己的经销商关联的表中。

我试过 setTable() :

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Auth;

class Client extends Model

    public function setTable($table)
    
        $this->table = 'd1clients';
        return $this;
    
    protected $fillable = ['dealer_id', 'user_id', 'type', 'first_name', 'last_name', 'phone', 'cellphone', 'email', 'stock', 'source', 'civic', 'road', 'city', 'province', 'country', 'postal_code', 'birth_date', 'driving_liscence'];

但它不会将客户端保存到表中。 还有这个:

'diclients'

应该是这样的:

'd'.Auth::user()->dealer_id.'clients'

这个东西我也试过了:

$globalDealerId = Auth::user()->dealer_id;
protected $table = 'd'.$globalDealerId.'clients';
protected $fillable = ['dealer_id', 'user_id', 'type', 'first_name', 'last_name', 'phone', 'cellphone', 'email', 'stock', 'source', 'civic', 'road', 'city', 'province', 'country', 'postal_code', 'birth_date', 'driving_liscence'];

文档说setTable应该可以工作,但我不知道我做错了什么......

【问题讨论】:

这个$this-&gt;table = 'd1clients'; 应该是$this-&gt;table = $table; 吗?然后运行setTable($dealer_id); 您遇到了什么错误?你能看看 eloquent 的查询吗? 我正在尝试查找此查询。但我不知道在哪里可以找到它。 有问题,我检索了查询,唯一破坏这一切的部分是:SQL: insert into "clients"。所以 setTable() 根本不起作用......它仍然是主表名...... 【参考方案1】:

我发现了问题。它是如何工作的:

模型需要有一个功能:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Client extends Model

    public function setTable($table)
    
        $this->table = $table;
        return $this;
    
    protected $fillable = ['dealer_id', 'user_id', 'type', 'first_name', 'last_name', 'phone', 'cellphone', 'email', 'stock', 'source', 'civic', 'road', 'city', 'province', 'country', 'postal_code', 'birth_date', 'driving_liscence'];

重要的是这个:

public function setTable($table)

    $this->table = $table;
    return $this;

然后,我去添加客户端的地方,在这种情况下,客户端被添加到控制器内的数据库中。所以你去吧,你这样做:

public function store(Request $request)

    $client =  new Client;
    $client -> setTable('d'.Auth::user()->id.'clients');
    $client -> dealer_id    = Auth::user()->dealer_id;
    $client -> user_id      = Auth::user()->id;
    $client -> type         = Request::get('type');
    $client -> first_name   = Request::get('first_name');
    $client -> last_name    = Request::get('last_name');
    $client -> phone        = Request::get('phone');
    $client -> cellphone    = Request::get('cellphone');
    $client -> email        = Request::get('email');
    $client -> city         = Request::get('city');
    $client -> stock        = Request::get('stock');
    $client -> source       = Request::get('source');
    $client -> save();

重要的是这一行:

$client -> setTable('d'.Auth::user()->id.'clients');

不要忘记开头的命名空间:

use DB;

现在,属于 A 公司的用户 A 会将客户添加到 daclients 表中。 B公司的用户B将客户端添加到dbclients表中。

特别感谢@amir bar 帮助我处理查询日志。 感谢这个问题:model - Update the table name at runtime not working - laravel Eloquent ORM

【讨论】:

以上是关于带有变量的 Laravel 模型表名的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 模型查找旧表名

如何在 Laravel 中使用带有变量的 create 方法

Laravel 在使用 ->create() 函数时不遵守模型中设置的表名

如何在 Laravel 中返​​回数据库表名

Laravel 查询构建器和表名

Laravel Auth 更改表名