Php laravel控制器与数据库不匹配
首先为标题道歉,我想不出更好的描述。 我有一个控制器,可以读取数据库,然后将其作为对象返回。这个数据库最近经历了一次结构上的变化,我对它进行了重新播种。我的控制器代码是:Php laravel控制器与数据库不匹配,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,首先为标题道歉,我想不出更好的描述。 我有一个控制器,可以读取数据库,然后将其作为对象返回。这个数据库最近经历了一次结构上的变化,我对它进行了重新播种。我的控制器代码是: $books=\App\book::where('userId',1)->get(); foreach(以$b的形式记账){ echo$b->bookId; } 这将导致以下输出: 70008000 。 然而,如果我通过tinker运行相同的程序,我会得到完全不同的结果。修补程序代码:App\Book::where('use
$books=\App\book::where('userId',1)->get();
foreach(以$b的形式记账){
echo$b->bookId;
}
这将导致以下输出:
70008000
。
然而,如果我通过tinker运行相同的程序,我会得到完全不同的结果。修补程序代码:App\Book::where('userId',1)->get()代码>
将产生多个记录,例如:
照亮\数据库\雄辩\收藏{#3018
全部:[
App\book{#2996
记录编号:1,
图书编号:“7iraCwAAQBAJ”,
用户ID:1,
作者:1,,
标题:“莱姆街的女巫”,
isbn:“9780307451064”,
描述:“1924年,一位波士顿外科医生的妻子参加了关于唯心论的激烈全国辩论,这是一场运动
致力于与死者沟通。记者称她为
莱姆街的金发女巫,但她的追随者只知道她
作为玛格利,她最直言不讳的支持者是亚瑟·柯南·道尔爵士
他完全相信玛格利的力量,所以他劝她进去
一个有争议的比赛,由《科学美国人》赞助
超自然的天赋迷惑了四位法官,只有一位
留下来说服…著名的脱逃艺术家哈里·胡迪尼
抓住了他们的电子公开竞争和
让他们进入彼此的轨道。”,
预览:“,
封面:“,
书籍状态:“阅读”,
创建时间:“2019-08-16 12:30:27”,
更新时间:“2019-08-16 12:30:27”,
},
在结果中,您将看到我突出显示了bookId。这是我在控制器中运行bookId时希望返回的结果
编辑
数据库
public function up()
{
Schema::create('books',函数(Blueprint$表){
$table->bigIncrements('recordId');
$table->string('bookId');
$table->integer('userId');
$table->integer('authorId');
//$table->integer('genreId');
$table->string('title');
$table->string('isbn');
$table->binary('description');
$table->string('preview');
$table->string('cover');
$table->string('book_status');
$table->timestamps();
});
//语句('ALTER TABLE BOOK AUTO_INCREMENT=2000');
}
雄辩模型
类目扩展模型
{
受保护的$primaryKey='bookId';
受保护的$fillable=[
“bookId”,
“用户ID”,
“作者”,
“头衔”,
“isbn”,
“说明”,
“预览”,
“掩护”,
“记账状态”
];
//$guarded=[];
公共功能作者(){
返回$this->belongsTo('App\author','authorId');
}
}
为了只获得一个结果,您需要使用laravel提供的first()
方法。这样做的目的是,它获取第一条记录并将其显示给您。此方法不会在结果集中迭代(循环)
因此,Tinker中的代码如下所示:
$books=\App\Book::where('userId',1)->first()->bookId;
这将只返回第一个结果bookId
Get()
方法用于获取集合。集合以数组的形式出现。这就是为什么要获取多组数据。表中的所有字段都将显示,所有数据都将显示(取决于您提供的选项,如where('userId',1)
)。这称为集合。要在集合中进行迭代或循环,您需要使用foreach循环,就像您在问题中所做的那样
foreach ($books as $b) {
echo $b->bookId;
}
这里的问题是,您正在回显$b->bookId
。当您在Laravel中回显时,它会将字段数据显示为整数。例如,如果您有bookId 1000、2000、3000、4000、5000,则结果将为10002000300040005000
。但是,如果您在控制器中执行类似操作:
foreach ($books as $b) {
echo "<li>" .$b->bookId. "<li>";
}
App\Book::where('userId', 1)->first()->bookId;
foreach($b){
echo“”$b->bookId.“ ”;
}
结果会是这样的:
- 一千
- 2000年
- 三千
- 四千
- 五千
如果要获取单个项目的bookId,可以执行以下操作(本例假设您知道记录的“id”):
$books=\App\Book::where('userId',1)->find(1)->bookId;
现在将显示id为1的结果的bookId
希望这有帮助。快乐编码:)在控制器中,您正在循环结果集,并对循环中的单个模型回显图书ID
。在tinker中,您正在检索结果,tinker将集合输出到控制台。在tinker中执行此操作将产生与控制器相同的输出:
foreach ($books as $b) {
echo "<li>" .$b->bookId. "<li>";
}
App\Book::where('userId', 1)->first()->bookId;
同样,在tinker中,您正在检索结果集,而不是一条记录,许多附加数据(如模型详细信息等)将打印在控制台中。希望此解释有所帮助
此外,您还需要更正控制器中的键入错误。我假设您的型号名称是Book
,而不是Book
,因此您应该使用该型号的大写名称。谢谢大家的帮助。但是,我的想法有点偏离了基础。问题在于我的型号。当我改变它时,我打算将主键改为'recordId',但保留为“bookId”。
看起来Laravel会将主键作为整数读取。所以当我运行代码时,它会看到bookId并认为它是主键,然后将其转换为整数。所以实际上发生了什么