Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5.1关于Model::find的雄辩变更表_Php_Mysql_Eloquent_Laravel 5.1 - Fatal编程技术网

Php Laravel 5.1关于Model::find的雄辩变更表

Php Laravel 5.1关于Model::find的雄辩变更表,php,mysql,eloquent,laravel-5.1,Php,Mysql,Eloquent,Laravel 5.1,在上一个问题中,我正在寻找使用模型保存查询,并在添加新查询时更改表。我找到了我的答案,你给了我一些提示。现在,当我更新一行时,我无法检索该行,因为Model::find使用模型中设置的表名。我试着用这个: $client = Client::fin(something); $client -> setTable(newTableName); $client -> things to update... $client -> save(); 这不管用。我尝试了一些类似的变体:

在上一个问题中,我正在寻找使用模型保存查询,并在添加新查询时更改表。我找到了我的答案,你给了我一些提示。现在,当我更新一行时,我无法检索该行,因为Model::find使用模型中设置的表名。我试着用这个:

$client = Client::fin(something);
$client -> setTable(newTableName);
$client -> things to update...
$client -> save();
这不管用。我尝试了一些类似的变体:

$client = Client->setTable(newTableName)::find(something);
public function getQualifiedKeyName()
{
    return $this->getTable().'.'.$this->getKeyName();
}

public function getKeyName()
{
    return $this->primaryKey;
}
但它也不起作用。。。我尝试了一些其他的东西

现在,我请求你帮忙找出问题所在

据我所知,当您使用Model::find时,它调用如下函数:

$client = Client->setTable(newTableName)::find(something);
public function getQualifiedKeyName()
{
    return $this->getTable().'.'.$this->getKeyName();
}

public function getKeyName()
{
    return $this->primaryKey;
}
但我不确定如何修改它,在get表名中输入一些变量,以便在正确的表中找到行

与模型客户端关联的表是clients,但它应该是:

'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个客户端,那个么结果是users表中有1000行,pivot表中有1000行,clients表中有1000行。对我来说,发球似乎需要处理大量数据。如果你有一个强大的服务器,这不是一个真正的问题。但这不是我的情况

我试图做的是,根据我对所有这些的理解,制作更小的表格,以加快流程。如果我将这1000000行放在不同的表中,我将为用户得到一个表,1000行的1000个表。当用户请求更新客户端时,系统将查看该用户,然后查找与该用户关联的表,然后在仅包含与该用户关联的客户端的表中获取请求的行

如果我是对的,处理大量数据的过程将会更短。除非我是对的。

有一个问题:

要在更新行数据时更改模型的表名,只需在模型内添加一个函数:

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将在正确的表中直接搜索需要更新的行


因此,如果我所说的在处理大量数据时加快工作速度的方法,这种方法将比创建两个表和一个数据透视表更快。

我强烈建议,有一个非常简单的方法来实现你的目标。我必须同意@BrynnBateman的观点。Elie我认为你应该有一个单独的类来负责处理这个逻辑。推荐的方法是使用模型关系来确保应用程序的正确行为,因此可以使用透视表或任何其他方法!只是做了一个编辑来谈谈我是如何理解它的工作原理的。来讨论你的问题。我刚刚在[本网站][1]上读到了一些关于优化的内容。
让你的应用程序完成这项工作
一节让我明白,最好将数据分成更小的表,让MySQL做更少的工作。如果我以PHP已经知道它需要在哪个表中查找的方式构建我的应用程序,而不是要求MySQL搜索它,那么它会更快吗?对吗?[1]: