iT邦幫忙

0

Laravel 中 User::where('id', '1')->get(); vs User::find(1) 有何不同?

請教一下高樓層學長:
為何我從 User 資料表中 使用 ORM 查詢時會出現如下問題:
一、以 where('id', '1')->get(); 方式:

    $users = User::where('id', '1')->get();        
    return view('test.index', compact('users'));

二、以 $users = User::find(1); 方式:

    $users = $users = User::find(1);        
    return view('test.index', compact('users'));

在 test/index.blade.php 中
一、可以正常顯示
二、卻報錯: Trying to get property 'id' of non-object

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>Document</title>
        </head>

        <body>
            @foreach ($users as $user)
                {{ $user->id }} <br>
            @endforeach
        </body>

    </html>

我嘗試 dd(gettype($users));
結果卻都返回 object
請教一下 這是甚麼原理?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2020-12-18 17:50:59
最佳解答

get()是一段資料集。
find的請求是一個記錄。

兩者請求的資料結構並不同。

認真來說。get拿到的就是多個記錄。

你把 get 換成 first。就是拿記錄的資料。
跟用find是一樣的資料串。

get拿到的值,我用json的方式來表現,會如下面這樣

[
    {
        id:1,
        data:'data'
    }
]

而find跟用first拿到的會是

{
    id:1,
    data:'data'
}

這樣是否明白

看更多先前的回應...收起先前的回應...

話說你摸 Laravel 也半年有了。
不該現在還搞不懂get跟find的應用差別了。

難不成你幾乎沒在用資料庫?

我學習的時間算一算已經超過一年,承您所言應該是要進入狀況了才對,為何會還沒有完全弄清楚Laravel,是因為自己剛學習 Laravel 時,連最基礎的計算機基礎都不懂,實在無法理解 Laravel,因此前陣子先去自學補充一下:php、mysql、js(jQ+ajax),現在才又回來學習Laravel,我其實也自我感覺有了很大的進步,這也要謝謝各位前輩不吝指導,藉此,再度鄭重謝謝大家。

其實,我知道
get() 與 all() 拿到的都是 collection 的對象
first() 與 find() 拿到的都是 1個對象
我比較疑惑的是 :
$users = User::find(1);
後 在 blade 要如何取值?
我老是得到

rying to get property 'id' of non-object

我覺得你還是沒搞懂。
如果依照你這邊的寫法

@foreach ($users as $user)
      {{ $user->id }} <br>
@endforeach

你用find取值。它並不是一個資料集。
但你卻用foreach。
當然會報錯啊。

先搞懂一下。看完我上面給你看的資料表現。
再去思考你能不能用foreach。

天啊!!

不要用「對象」來理解。你會完全搞不懂。
這裏先說明一下名詞。

資料集就是1到多個記錄。(就算記錄只有1個也算資料集)
記錄就是單純的記錄。

get all 拿的是「資料集」
find first 拿到的是「記錄」

一般用foreach。是因為拿的是資料集。才會跑迴圈一筆一筆記錄取出來用。

但直接就是記錄了。就不需要跑迴圈了。

好的!非常謝謝不吝指教,我再來好好研究一下,先問下:

    @foreach($users in $key => $value)
        echo $key : $value
    @endforeach

foreach 不是也能循環對象嗎? 我結果卻是:

Undefined offset: 1

通了

還好你通了。
要不然我一整個很無奈的。

/images/emoticon/emoticon01.gif

我要發表回答

立即登入回答