Php 在同一个表中创建关系在laravel中不起作用

Php 在同一个表中创建关系在laravel中不起作用,php,laravel,eloquent,foreign-keys,Php,Laravel,Eloquent,Foreign Keys,我在迁移文件中有一个categories表,其sql为: public function up() { Schema::create('categories', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table->string('slug')->unique(); $tab

我在迁移文件中有一个categories表,其sql为:

public function up()
{
    Schema::create('categories', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('slug')->unique();
        $table->boolean('is_parent')->default(true);
        $table->unsignedBigInteger('parent')->nullable();
        $table->foreign('parent')->references('id')->on('categories')->onDelete('SET NULL');
        $table->integer('priority');
        $table->timestamps();
    });
}
我还在关系的类别模型中创建了以下函数:

public function categoryName(){
    return $this->belongsTo('App\Models\Category'); 
}
但是,当我尝试这样做时,
{{$categoryList->categoryName->name}
,它给出了以下错误

试图获取非对象的属性(视图:C:\xampp\htdocs\projects\gokarna\resources\views\admin\pages\categories.blade.php) 但是,它与我获取帖子类别的posts表完美配合

这就是我在控制器里的东西:

public function index()
{
    $parent = $this->category->where('is_parent', 1)->get();
    $allCategories = $this->category->get();

    return view('admin.pages.categories', compact('parent', 'allCategories'));
}
外键不使用同一个表的逻辑是什么

编辑
$categoryList=$allCategories
所以我得到了类别。我尝试将列
parent
重命名为
category\u id
当我执行
{{$categoryList->categoryName}
时,它会提供json数据,但当我执行
{{$categoryList->categoryName->name}
时,它不会提供输出


我还尝试将
categoryName
重命名为
category
它的操作与上面的操作相同,它使用
{{$categoryList->category}
给出,但在执行此操作时抛出一个错误
{{$categoryList->categoryName->name}
修改您的方法如下:

public function categoryName(){
返回$this->belongsTo('App\Models\Category','parent');
}
在不添加外键的情况下,它将使用方法名来获取父对象

无论何时,当您面对查询或结果的
dd
问题时,这都是一个很好的做法

因此,您可以像这样调试它(将此写在可以测试它的地方):
dd(Category::first()->categoryName()->toSql())这应该会给你一个发生了什么的提示


您将遇到以下错误:

试图获取非对象的属性(视图:C:\xampp\htdocs\projects\gokarna\resources\views\admin\pages\categories.blade.php),但它与我获取帖子类别的posts表完美配合

因为视图中的
..->categoryName->..
为空,因此使得
->categoryName->name
无效

另外,在控制器中,您没有发送
$categoryList
,我看不到:

公共功能索引()
{
$parent=$this->category->where('is_parent',1)->get();
$allCategories=$this->categories->get();
//此处未发送$categoryList?
返回视图('admin.pages.categories',compact('parent','allCategories');
}
但是,由于$categoryList变量没有定义,所以没有显示错误,所以它就在某个地方,但您忘了向我们提到它的位置,然而,您的问题中实际上有一些不清楚的地方


我建议您将代码修改为
。。。
$table->unsignedBigInteger('category_id')->nullable();//因为'parent'是一个保留的mysql关键字
$table->foreign('category_id')->references('id')->on('categories')->onDelete('SET NULL');
...
类别模型
公共功能类别(){
#在本例中,Laravel将查找方法\u name+\u id的列
#因此,它将查找…category_id,而无需手动定义
#外键
返回$this->belongsTo('App\Models\Category');
}
然后,您可以很容易地在视图中看到它,如:

<td>{{ $whateverCategoryObjectThisIs->category->name }}</td>

为了得到预期的答案,我做了以下工作:

{{ $categoryList->category['name']}}
就像我在评论中说的那样,当我做
{{$categoryList->category}}
但做
{{$categoryList->category->name}
时,我得到了一个对象

问题是如果任何对象不包含任何属性,而您尝试使用该属性,
它会给你一个错误。但对于数组,如果将其用作数组的键,它将显示null

plz post控制器操作的CodeElount通过检查关系方法的名称并在方法名称后面加上
\u id
来确定默认外键名称。但是,如果模型上的外键不是
category\u name\u id
,则应将自定义键名称作为第二个参数传递给belongsTo方法。
$categoryList=$allCategories
,因此我得到的是categories。我尝试将列
parent
重命名为
category\u id
当我只执行
{{{$categoryList->categoryName}
时,它会提供json数据,但当我执行
{{$categoryList->categoryName->name}时,它不会提供输出
在我的示例中,我将方法名称修改为
categoryName
而不是
categoryName
,因此如果您也进行了修改,请尝试使用
->categoryName->name
而不是
->categoryName->name
或者在
categoryName
方法中执行此操作
返回$this->belongsTo('App Models\category','category\id'));请注意,“category_id”是类别数据库表中的列
{{ $categoryList->category['name']}}