Php 在同一个表中创建关系在laravel中不起作用
我在迁移文件中有一个categories表,其sql为: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
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']}}