php - Laravel belongsTo 和 hasMany 不返回数据
问题描述
我是 laravel/eloquent 的新手,到目前为止非常喜欢它们,但我无法让 belongsTo 和 hasMany 工作。我已经阅读了其他人遇到的无数问题,但还没有找到可以为我解决问题的解决方案。
我有一个“页面”模型和一个“类别”模型。这是表的定义:
Schema::create('pages', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
});
Schema::create('categories', function (Blueprint $table) {
$table->increments('id');
$table->integer('page_id');
$table->foreign('page_id')->references('id')->on('pages');
$table->string('name');
$table->timestamps();
});
这是我的页面模型:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Page extends Model
{
public function categories()
{
return $this->hasMany('App\Category');
}
}
这是我的类别模型:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
public function page()
{
return $this->belongsTo('App\Page');
}
}
以下是一些修补的结果:
> php artisan cache:clear
Application cache cleared!
> php artisan tinker
>>> \App\Category::find(1)
=> App\Category {#2916
id: "1",
page_id: "1",
name: "First Category",
created_at: "2018-12-30 03:18:07.347",
updated_at: "2018-12-30 03:18:07.347",
}
>>> \App\Category::find(1)->page()
=> Illuminate\Database\Eloquent\Relations\BelongsTo {#2918}
>>> \App\Page::find(1)
=> App\Page {#2902
id: "1",
name: "First Page",
created_at: "2018-12-30 03:18:07.220",
updated_at: "2018-12-30 03:18:07.220",
}
>>> \App\Page::find(1)->categories()
=> Illuminate\Database\Eloquent\Relations\HasMany {#2922}
>>>
我得到我的对象就好了,但是当我尝试拉关系时,我只是得到看起来像空对象的东西:
=> Illuminate\Database\Eloquent\Relations\BelongsTo {#2918}
=> Illuminate\Database\Eloquent\Relations\HasMany {#2922}
如果我将我的 page() 和 categories() 函数换成这样的函数,一切都很好:
public function page()
{
return \App\Page::find($this->page_id);
}
public function categories()
{
return \App\Category::where('page_id', $this->id)->get();
}
以下是这些结果:
> php artisan cache:clear
Application cache cleared!
> php artisan tinker
Psy Shell v0.9.9 (PHP 7.3.0 — cli) by Justin Hileman
>>> \App\Page::find(1)
=> App\Page {#2916
id: "1",
name: "First Page",
created_at: "2018-12-30 03:18:07.220",
updated_at: "2018-12-30 03:18:07.220",
}
>>> \App\Page::find(1)->categories()
=> Illuminate\Database\Eloquent\Collection {#2918
all: [
App\Category {#2921
id: "1",
page_id: "1",
name: "First Category",
created_at: "2018-12-30 03:18:07.347",
updated_at: "2018-12-30 03:18:07.347",
},
App\Category {#2922
id: "2",
page_id: "1",
name: "Second Category",
created_at: "2018-12-30 03:18:07.480",
updated_at: "2018-12-30 03:18:07.480",
},
App\Category {#2923
id: "3",
page_id: "1",
name: "Third Category",
created_at: "2018-12-30 03:18:07.623",
updated_at: "2018-12-30 03:18:07.623",
},
],
}
>>> \App\Category::find(1)
=> App\Category {#2904
id: "1",
page_id: "1",
name: "First Category",
created_at: "2018-12-30 03:18:07.347",
updated_at: "2018-12-30 03:18:07.347",
}
>>> \App\Category::find(1)->page()
=> App\Page {#2921
id: "1",
name: "First Page",
created_at: "2018-12-30 03:18:07.220",
updated_at: "2018-12-30 03:18:07.220",
}
>>>
编辑:
我发现如果我添加->get()
我会在修补时看到数据,正如我所期望的那样:
public function page()
{
return $this->belongsTo('App\Page')->get();
}
然而,我见过的例子都没有显示有人这样做。我只是误解了这应该如何工作吗?我希望在修补时只做 $page->categories(); 会给我类别而不需要做 $page->categories()->get();
解决方案
试试这个。
Schema::create('categories', function (Blueprint $table) {
$table->increments('id');
$table->integer('page_id')->unsigned();
$table->foreign('page_id')->references('id')->on('pages');
$table->string('name');
$table->timestamps();
});
推荐阅读
- amazon-web-services - AWS 只读副本增加了三倍,然后是主副本
- vba - 如何在 VBA 中截断双精度
- image - Docker 容器调度程序
- php - 如何在 Laravel 中接受和处理外部请求
- asp.net-core - ASP.Net Core - 使用存储过程而不是包含的渴望加载
- python - Scrapy Text 之后
- python - 在 Python 的 Matplotlib 中,如何让细图像与主图像相邻?
- c - 带返回指针的 free 的正确用法是什么?
- ios - 此应用程序是否使用广告标识符 (IDFA)?使用 Firebase 时
- python - 有没有办法用新格式从 weblate 重新生成 PO 文件?