Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php laravel控制器与数据库不匹配_Php_Mysql_Laravel_Eloquent - Fatal编程技术网

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并认为它是主键,然后将其转换为整数。所以实际上发生了什么