【问题标题】:laravel controller not matching databaselaravel 控制器不匹配数据库
【发布时间】:2019-12-22 19:57:42
【问题描述】:

首先为标题道歉,我想不出更好的描述。 我有一个控制器,它假设读取数据库然后将其作为对象返回。这个数据库最近经历了结构上的变化,我重新植入了它。我的控制器代码是:

$books = \App\book::where('userId',1)->get();
foreach ($books as $b) {
    echo$b->bookId;
}

这将导致以下输出:

70008000

。 但是,如果我通过修补程序运行相同的程序,我会得到完全不同的结果。修补程序代码:App\Book::where('userId',1)->get(); 将产生几条记录,例如:

Illuminate\Database\Eloquent\Collection {#3018 全部: [ 应用\图书{#2996 记录ID:1, bookId: "7iraCwAAQBAJ", 用户ID:1, 作者ID:1, 标题:“石灰街的女巫”, isbn:“9780307451064”, 描述:“1924 年,一位波士顿外科医生的妻子来体现了全国对招魂术的激烈辩论,这是一场运动 致力于与死者交流。记者称她为 石灰街的金发女巫,但她的追随者只知道她 作为玛格丽。她最直言不讳的拥护者是亚瑟柯南道尔爵士,他 他非常相信玛格丽的力量,以至于他敦促她进入 由《科学美国人》赞助的有争议的竞赛。她 超自然的礼物迷惑了四位法官。只有一个 留下来说服……著名的逃脱艺术家哈里·胡迪尼。贾赫 捕捉他们的电动公共竞争和竞争 将它们带入彼此的轨道。", 预览:"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: "正在阅读", created_at: "2019-08-16 12:30:27", 更新时间:“2019-08-16 12:30:27”, },

在结果中,您会看到我突出显示了 bookId。当我通过控制器运行它时,这就是我期望返回的结果。

编辑

数据库

public function up()
    {
        Schema::create('books', function (Blueprint $table) {
            $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();
        });
        //DB::statement('ALTER TABLE books AUTO_INCREMENT = 2000');
    }

雄辩的模型

class book extends Model
{
    protected $primaryKey = 'bookId'; 
    protected $fillable = [
        'bookId',
        'userId',
        'authorId',
        'title',
        'isbn',
        'description',
        'preview',
        'cover',
        'book_status'
    ];
    //$guarded = [];
    public function authors(){
        return $this->belongsTo('App\author','authorId');
    }
}

【问题讨论】:

  • 您是否尝试清除缓存?

标签: php mysql laravel eloquent


【解决方案1】:

为了只得到一个结果,你需要来自 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>";
}

结果会是这样的:

  • 1000
  • 2000
  • 3000
  • 4000
  • 5000

如果您想获取单个项目的 bookId,您将执行以下操作(此示例假设您知道记录 'id'):

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

现在将显示 id=1 的结果的 bookId。

希望这会有所帮助。快乐编码:)

【讨论】:

  • 我继续添加模型以及数据库结构。我只有一个模型,这是我的一个错误,但并没有改变我的任何问题。
  • 您只想获取 bookId 吗?
  • 请查看更新后的答案。希望这就是你要找的
【解决方案2】:

在您的控制器中,您循环遍历结果集并为循环中的单个模型回显bookId。在 tinker 中,您正在检索结果,并且 tinker 将集合输出到控制台。在 tinker 中执行此操作会产生与控制器相同的输出:

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

同样,在 tinker 中,您正在检索结果集,而不是一条记录,并且许多附加数据,如模型详细信息等,将在控制台中打印。希望这个解释有所帮助。

另外,您需要更正控制器中的拼写错误。我假设您的模型名称是 Book,而不是 book,因此您应该使用模型的大写名称。

【讨论】:

    【解决方案3】:

    感谢大家的帮助。然而,我离基地很远。问题出在我的模型中。当我更改它时,我的意思是将主键更改为“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”,它修复了所有问题。

    【讨论】:

      猜你喜欢
      • 2016-12-25
      • 2017-02-25
      • 2018-10-20
      • 2020-08-08
      • 2017-11-09
      • 2020-04-29
      • 1970-01-01
      • 2016-07-21
      • 2013-01-14
      相关资源
      最近更新 更多