为了账号安全,请及时绑定邮箱和手机立即绑定

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 捕捉到了他们的电动公开竞争以及将他们带入彼此轨道的竞争。”,预览:“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 中,您正在检索结果集,而不是单个记录,并且许多附加数据,如模型详细信息等,将在控制台中打印。希望这个解释有帮助。

此外,您需要更正控制器中的错字。我假设您的模型名称是Bookbook因此您应该使用模型的大写名称。


查看完整回答
反对 回复 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 关注
  • 184 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信