簡體   English   中英

Laravel 5.1在Model :: find上的雄辯變更表

[英]Laravel 5.1 Eloquent change table on Model::find

在上一個問題中,我正在尋找一個使用Model的保存查詢,並在添加新查詢時更改表。 我找到了您的答案,並提供了一些提示。 現在,當我更新一行時,由於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行以及1000萬客戶表中的行。 對我來說,服務器需要處理大量數據。 如果您擁有功能強大的服務器,這不是一個真正的問題。 但這不是我的情況。

根據我的理解,我試圖做的是使表變小以使過程更快。 如果將這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將在右表中搜索需要直接更新的行。

因此,如果我談論的是在處理大量數據時加快工作速度的方法,那么與創建兩個表和數據透視表相比,這種方法會更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM