在上一个问题中,我正在寻找使用模型保存查询并在添加新查询时更改表。我通过你的一些提示找到了答案。现在,当我更新一行时,我无法检索该行,因为 Model::find 使用模型中设置的表名。我尝试使用这个:
$client = Client::fin(something);
$client -> setTable(newTableName);
$client -> things to update...
$client -> save();
这行不通。我尝试了一些像这样的变体:
$client = Client->setTable(newTableName)::find(something);
但它也不起作用......我尝试了一些其他的东西。
现在,我请求您帮助查找问题。
据我所知,当您使用 Model::find 时,它会调用如下函数:
public function getQualifiedKeyName()
{
return $this->getTable().'.'.$this->getKeyName();
}
public function getKeyName()
{
return $this->primaryKey;
}
但我不太确定如何修改它以在获取表名称中输入一些变量来查找右表中的行。
与模型客户端关联的表是客户端,但它应该是:
'd'.Auth::user()->dealer_id.'clients'
因此,如果用户与经销商 ABC 关联,并且该经销商的 id 为 1,则表名将为 d1clients。
你能告诉我正确的方向吗?
谢谢大家!
编辑:我添加此部分是因为我需要一些空间来解释为什么我要这样做。
这就是我对幕后工作的理解。
有一个包含表的数据库。
每个表都包含行。
当您想要将表 A 中的行与表 B 中的行关联时,您可以创建一个数据透视表来进行关联。当您请求在表中查找数据时,服务器会查看数据透视表以查找表 B 中的哪些行与表 A 中的行相关联。示例,只是为了向您展示我是否理解得很好:
表用户:
1 | username
2 | username
3 | username
表客户端:
1 | clientName
2 | clientName
3 | clientName
4 | clientName
数据透视表:
users | clients
1 | 1 - 3
2 | 2
3 | 4
当用户#1请求更新客户端#1时,服务器会查找客户端与用户#1关联的数据透视表,然后,如果客户端#1与用户#1关联,它将进入客户端表并获取来自客户端 #1 的数据。
这似乎很容易设置,但如果我是对的,如果我有 1000 个用户,每个用户有 1000 个客户端,则结果是用户表中有 1000 行,数据透视表中有 1000 行,客户表中有 1 000 000 行。对我来说,看起来服务需要处理大量数据。如果你有一个强大的服务器,这不是一个真正的问题。但这不是我的情况。
根据我对这一切的理解,我试图做的是制作更小的表格以使过程更快。如果我将这 1 000 000 行放在不同的表中,我将为用户获得 1 个表,即 1 000 个表,每张表 1 000 行。当用户请求更新客户端时,系统将查看该用户,然后找到与该用户关联的表,然后在仅包含与该用户关联的客户端的表中获取请求的行。
如果我是对的,数据量巨大的过程会更短。只要我是对的。
最佳答案
有一个问题:
当您想要更新一行数据时,要更改模型的表名称,您只需在模型中添加一个函数即可:
public function getTable()
{
return 'tableName';
}
因此,对于我的应用程序,我需要在命名空间之后添加以下内容:
use Auth;
然后添加这个功能:
public function getTable()
{
return 'd'.Auth::user()->dealer_id.'clients';
}
因此,当您更新一行时,您可以简单地执行以下操作:
$client = Client::find(Request::get('clientID'));
$client -> last_name = Request::get('up_last_name');
$client -> first_name = Request::get('up_first_name');
$client -> phone = Request::get('up_phone');
$client -> cellphone = Request::get('up_cellphone');
$client -> email = Request::get('up_email');
$client -> civic = Request::get('up_civic');
$client -> road = Request::get('up_road');
$client -> city = Request::get('up_city');
$client -> province = Request::get('up_province');
$client -> postal_code = Request::get('up_postal_code');
$client -> birth_date = Request::get('up_birth_date');
$client -> driving_liscence = Request::get('up_driving_liscence');
$client -> touch();
$client -> save();
这样,MySQL将直接在右表中搜索需要更新的行。
因此,如果当您处理大量数据时加快工作速度的方法,这种方式会比创建两个表和一个数据透视表更快。
关于php - Laravel 5.1 Model::find 上的 Eloquent 变更表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34046915/