【问题标题】:Laravel 5.1 Eloquent change table on Model::findLaravel 5.1 Model::find 上的 Eloquent 更改表
【发布时间】:2016-03-06 22:34:34
【问题描述】:

在上一个问题中,我正在寻找使用模型保存查询并在添加新查询时更改表。我用你的一些提示找到了我的答案。现在,当我更新一行时,我无法检索该行,因为 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;
}

但我不确定如何修改它以在获取表名中输入一些变量以找到正确表中的行。

与模型 Client 关联的表是 clients,但它应该是:

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

因此,如果用户与 Dealer 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 的数据。

这似乎很容易设置,但如果我是对的,如果我有 1 000 个用户并且每个用户有 1 000 个客户端,则结果是用户表中有 1 000 行,数据透视表中有 1 000 行和客户表中有 1 000 000 行。对我来说,服务看起来需要处理大量数据。如果你有一个强大的服务器,这不是一个真正的问题。但这不是我的情况。

根据我对这一切的理解,我尝试做的是制作更小的桌子以加快流程。如果我将这 1 000 000 行放在不同的表中,我将得到 1 个用户表,1 000 个 1 000 行的表。当用户向客户端请求更新时,系统会查看该用户,然后找到与该用户关联的表,然后在仅包含与该用户关联的客户端的表中获取请求的行。

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

【问题讨论】:

  • 我强烈推荐reading the comment I left on your previous post,有一种非常简单的方法可以实现您的目标。
  • 我必须同意@BrynnBateman 阅读relationships
  • Elie 我认为你应该有一个单独的类负责为你处理这个逻辑。推荐的方法是使用模型关系来确保应用程序的正确行为,因此可以使用数据透视表或任何其他方式!
  • 刚刚做了一个编辑来谈谈我如何理解它是如何工作的。讨论您的问题。
  • 我刚刚在 [本网站][1] 上阅读了一些关于优化的内容。 Making Your Application Do The Work 部分让我明白,最好将数据分离到较小的表中以减少 MySQL 的工作量。如果我以 PHP 已经知道它需要在哪个表中查找而不是要求 MySQL 搜索它的方式构建我的应用程序,它会更快吗?正确的? [1]:mysqlperformancetuning.com/…

标签: php mysql eloquent laravel-5.1


【解决方案1】:

有问题:

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

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会直接在右表中搜索需要更新的行。

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

【讨论】:

    猜你喜欢
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2015-10-23
    • 2015-12-17
    相关资源
    最近更新 更多