亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Laravel 控制器與數據庫不匹配

Laravel 控制器與數據庫不匹配

PHP
郎朗坤 2021-11-26 16:03:30
首先為標題道歉,我想不出更好的描述。我有一個控制器,它應該讀取一個數據庫然后將它作為一個對象返回。這個數據庫最近在結構上發生了變化,我重新播種了它。我的控制器代碼是:$books = \App\book::where('userId',1)->get();     foreach ($books as $b) {         echo$b->bookId;         }這將導致以下輸出:70008000. 但是,如果我通過 tinker 運行相同的程序,則會得到完全不同的結果。Tinker code:App\Book::where('userId',1)->get(); 會產生幾條記錄,例如:Illuminate\Database\Eloquent\Collection {#3018 all: [ App\book {#2996 recordId: 1, bookId: "7iraCwAAQBAJ", userId: 1, authorId: 1, title: "The Witch of Lime Street", isbn: "9780307451064", 描述: "1924 年,一位波士頓外科醫生的妻子來了一場關于唯靈論的激烈全國辯論,這是一場致力于與死者交流。記者稱她為石灰街的金發女巫,但她的追隨者只知道她是瑪格麗。她最直言不諱的倡導者是亞瑟·柯南·道爾爵士,他非常相信瑪格麗的力量,并敦促她進入一個有爭議的比賽,由《科學美國人》贊助。她的超自然天賦吸引了四位評委。只有一個人可以說服……著名的逃生藝術家哈里·胡迪尼。Jaher 捕捉到了他們的電動公開競爭以及將他們帶入彼此軌道的競爭?!保A覽:“http://books.google.com/books?id=7iraCwAAQBAJ&dq=9780307451071&hl=&source=gbs_api ”,封面:“ http://books.google.com/books/content?id=7iraCwAAQBAJ&printsec=frontcover&img=1&zoom=5&edge= curl&source=gbs_api ", book_status: "reading", created_at: "2019-08-16 12:30:27", updated_at: "2019-08-16 12:30:27", },在結果中,您將看到我突出顯示了 bookId。當我通過我的控制器運行它時,這就是我期望返回的結果。
查看完整描述

3 回答

?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

在您的控制器中,您正在循環結果集并bookId在循環中為單個模型回顯 。在 tinker 中,您正在檢索結果,并且 tinker 將集合輸出到控制臺。在 tinker 中執行此操作應該會產生與您的控制器相同的輸出:

App\Book::where('userId', 1)->first()->bookId;

同樣,在 tinker 中,您正在檢索結果集,而不是單個記錄,并且許多附加數據,如模型詳細信息等,將在控制臺中打印。希望這個解釋有幫助。

此外,您需要更正控制器中的錯字。我假設您的模型名稱是Book,book因此您應該使用模型的大寫名稱。


查看完整回答
反對 回復 2021-11-26
?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

然而,我離基地很遠。問題出在我的模型中。當我更改它時,我打算將主鍵更改為“recordId”,但將其保留為“bookId”。

看起來 Laravel 會將該主鍵讀取為整數。因此,當我運行代碼時,它會看到 bookId 并認為它是主要的,然后將其轉換為整數。所以實際上發生的事情是這樣的:


$books = \App\book::where('userId',1)->get();

foreach ($books as $b) {

    //$b->bookid = '7iraCwAAQBAJ'

    echo intval($b->bookId);

    //intval($b->bookId) = 7

}

我將主鍵更改為“recordId”并修復了所有問題。


查看完整回答
反對 回復 2021-11-26
?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

為了只獲得一個結果,您將需要first()laravel 中的方法。它的作用是,它獲取第一個記錄并將其顯示給您。此方法不會遍歷(循環)您的結果集。


所以你在 Tinker 中的代碼將是這樣的:


$books = \App\Book::where('userId',1)->first()->bookId;


這將只返回第一個結果bookId。


Get()方法用于獲取集合。集合作為數組出現。這就是為什么你會得到幾組數據。將顯示表中的所有字段并顯示所有數據(取決于您提供的選項,例如where('userId', 1))。這就是所謂的集合。并且要迭代或循環訪問集合,您將需要像在問題中所做的那樣使用 foreach 循環。


foreach ($books as $b) {

    echo $b->bookId;

}

這里的問題是你在 echo-ing $b->bookId。當您在 Laravel 中 echo 時,它會將字段數據顯示為整數。就像說,如果你有 bookId 1000, 2000, 3000, 4000, 5000 結果將是10002000300040005000. 但是,如果您在控制器中執行以下操作:


foreach ($books as $b) {

  echo "<li>" .$b->bookId. "<li>";

}

結果將是這樣的:


1000

2000年

3000

4000

5000

如果您想獲取單個 Item 的 bookId,您將執行以下操作(此示例假設您知道記錄“id”):


$books = \App\Book::where('userId',1)->find(1)->bookId;


現在將顯示 id=1 結果的 bookId。


希望這可以幫助。快樂編碼:)


查看完整回答
反對 回復 2021-11-26
  • 3 回答
  • 0 關注
  • 215 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號