iT邦幫忙

1

卡關中了,用LARAVEL的orm問題

  • 分享至 

  • xImage

先說明一下情境

我有一張表內有5個欄位跟userid有關的。

DB:test
id uid1  uid2  uid3  uid4  uid5

在其test表中,我暫時先用

public function user1()
    {
        return $this->hasOne('App\Models\user\user', 'id', 'uid1');
    }
public function user2()
    {
        return $this->hasOne('App\Models\user\user', 'id', 'uid2');
    }
    .........(以下省略)

其實用以上的方式是可以解決我的問題了。
不過我還是想要問一下看看有沒有可能有更省略的一次性寫法。
不要5個uid就要寫5個關聯,10個uid就要10個。

老人我比較想追求更好的寫法,看有沒有人可以教教一下。


後續的處理,其實有找到我想要的寫法。還找出了3套方式。
很感謝一些人跟我一起研究。

可惜的是,這三套方式是沒辦法跟原來的效能相比較。
其中一招還大大的增加查尋時間。

所以我最後下結論:
看樣子不太可能如我想像的寫法了。除非改寫核心增加新的方式處理。
(這點就不需要了,改版會很痛苦)

反正原來的關聯方式,也不過是多打幾個字,且變動機率也不高。
就......結案吧。

我保留到明天看看有沒有人可以想出更好的方法。

通靈亡 iT邦高手 1 級 ‧ 2020-06-18 15:27:55 檢舉
星空大大你問的是類似這個問題嗎?
https://stackoverflow.com/questions/43510334/merge-two-hasone-relation-in-laravel-eloquent

現在手邊目前沒Laravel的環境沒辦法實測

不過或許可以用For迴圈跑所有的$this->hasOne關聯後,合併成一個Collection
但是相對有N個欄位就會做N次查詢,效能會拖到,感覺應該不是你要的
hasOne我也試過了沒錯,的確效能會拖到。
目前暫時還是單純關聯是最快的。

最多就10個id,建立10個關聯。
我其實已經研究半天,打算放棄找其它方法了。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
boboys501
iT邦新手 5 級 ‧ 2020-06-18 14:33:10

如果在同一張表你可以用
user_id當作主key

例如你有一個user table
他有
id name textA textB

另一個 abc table
id user_id text1 text2

user hasone abc
abc belongsto user
你這樣就可以用一次關聯就可以了,到時候你就直接用指向就可以取用了
正向 user->abc->text1
反向 abc->user->name

不知道這樣有沒有解答到你(?
我也是在關聯這塊卡很久XD
苦讀官方文件很多次

雖然沒有解決我的問題,但還是感謝你的回答。
你說的這是多態的方式應用。

目前其實有問過了其它人,有其它方式可以解決我想要的寫法。
但會增加效能負載。我只好放棄這樣的寫法。

也有人說可以自已去set call一下。
不過與我的本意原則不太一樣。

其實主要是我的目的想知道原核心是否有其它能對應的方式。
而不是去改造它。
如果沒有的話,其實乖乖的用目前關聯的方式也能達到我要的需求。

只是想找看看有沒有更好的應用寫法。

boboys501 iT邦新手 5 級 ‧ 2020-06-18 15:45:15 檢舉

啊我好像有跟你一樣的狀況,剛剛看了一下程式碼,我自己也是寫一條一條關聯沒錯...哈哈
但是每一欄位對應的功能都不同,如果要一條解決好像有難度

0
Victor
iT邦新手 2 級 ‧ 2020-06-18 16:21:58
public function user($number)
{
    $column = 'uid'. $number;
    return $this->hasOne('App\Models\user\user', 'id', $column)->first();
}

哈哈哈,以改最少的情況,不知道這樣可不可以動,提供你試試看!我沒有實際操作過以上程式碼

model內沒辦法給參數。所以也無解。
其實我也試過了。

這樣子會直接報錯。

Victor iT邦新手 2 級 ‧ 2020-06-19 09:04:31 檢舉

應該可以給參數,你實體物件是這樣使用嗎?

$test = new Test;
$test->user(1);

user 方法中有加上 first 讓它顯示第一筆

0
firecold
iT邦新手 1 級 ‧ 2020-06-18 18:34:35

開多對多中介表如何
雖然要多維護一個表
但是可以從11個query變成3個

DB test
id
DB test_relation
id test_id user_id
DB user
id name
Test.php
public function user_list()
    {
        return $this->hasManyThrough('UserModel','TestRelationModel', 'test_id',
            'id', 'id', 'user_id');
    }

不知道這樣有沒有符合星空大的需求

我要發表回答

立即登入回答