【问题标题】:Facing problem to show properly sub-categories in the Categories Dropdown list面临在类别下拉列表中正确显示子类别的问题
【发布时间】:2020-05-06 06:20:51
【问题描述】:

类别下拉列表中显示子类别的问题

在我的代码中,我想在产品表类别显示类别和子类别 .

这是我的类别表

1.

 public function up() { Schema::create('categories', function (Blueprint $table) {

    $table->increments('id');
    $table->integer('parent_id'); //sub category id
    $table->string('name');  
    $table->rememberToken();
    $table->timestamps();

    });
}

这是我的产品表

2.

public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('category_id');
        $table->string('product_name');
        $table->timestamps();
    });
}

这是我的类别模式l

3.Category.php

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class Category extends Model { protected $guarded=[];

    public function products(){
        return $this->hasMany('App\Product');
    }

    public function parent(){
        return $this->belongsTo('App\Category','parent_id','id');
    }
}

这是我的产品型号

4.Product.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    public function category(){
        return $this->hasone('App\Category');
    }

}

现在这是我的 ProductsController.php

5.ProductsController.php

<?php
namespace App\Http\Controllers;
use App\Category;
use App\Product;
use Session;
use Illuminate\Http\Request;
class ProductsController extends Controller
{
    public  function product(){
         return view('admin.products.product');
     }


}

这是我的 product.blade.php 文件

<form class="form-horizontal" method="post" action="{{route('add.product')}}" name="add_product" id="add_product" novalidate="novalidate">
                                @csrf

                                <div class="control-group">
                                    <label class="control-label">Under Category </label>
                                    <div class="controls">
                                        <select name="category_id" id="category_id" style="width:220px;"  >
                                            <option value='' selected disabled>Select</option>
                                           @foreach(App\Category::all() as $cat)
                                                <option value="{{$cat->id}}"  >
                                                    {{ $cat->parent ? $cat->parent->name .' -- ' : '' }}
                                                    {{$cat->name}}
                                                </option>
                                            @endforeach
                                        </select>
                                    </div>
                                </div>


                                <div class="control-group">
                                    <label class="control-label">Product Name</label>
                                    <div class="controls">
                                        <input type="text" name="product_name" id="product_name">
                                    </div>
                                </div>

                                <div class="form-actions">
                                    <input type="submit" value="submit" class="btn btn-success">
                                </div>
                            </form>

我想要这样的数据

这就是我使用此代码的原因 product.blade.php

 @foreach(App\Category::all() as $cat)
                                                <option value="{{$cat->id}}"  >
                                                    {{ $cat->parent ? $cat->parent->name .' -- ' : '' }}
                                                    {{$cat->name}}
                                                </option>
                                            @endforeach

但我得到这样的数据,我不想要:-

【问题讨论】:

  • 旁注:return $this-&gt;belongsTo('App\Category');Product 模型中是正确的关系。

标签: php laravel eloquent e-commerce


【解决方案1】:
@foreach(App\Category::all() as $cat)
 <option value="{{$cat->id}}"  >
  {{ $cat->parent ? '--' . $cat->name : $cat->parent->name }}
 </option>
@endforeach

我认为结果会是这样的。 如果没有父渲染类别$cat-&gt;parent-&gt;name。 如果有父渲染子类别'--' . $cat-&gt;name

Shoes
-- Casual Shoes

希望对你有帮助

【讨论】:

  • 如果你在 Laravel 中使用类别和子类别,我建议你使用闭包表。 github.com/franzose/ClosureTable祝你好运!
  • 试图获取非对象的属性“名称”
  • 如果我使用您的代码,它会收到类似的错误 尝试获取非对象的属性“名称”(查看:F:\laragon\www\flipcart\resources\views\admin \products\product.blade.php)
  • @foreach(App\Category::all() as $cat) @endforeach
  • @TareqAhmed 嗨,你能告诉我两者中的哪一个给出错误$cat-&gt;parent-&gt;name$cat-&gt;name
【解决方案2】:

Category.php - 添加子关系

public function children(){
    return $this->hasMany('App\Category','id','parent_id');
}

product.blade.php

<select name="category_id" id="category_id" style="width:220px;"  >
  <option value='' selected disabled>Select</option>
      @foreach(App\Category::where('parent_id', 0)->get() as $parent)
          <option value="{{$parent->id}}">
              {{ $parent->name }}
          </option>
          @foreach($parent->children as $child)
              <option value="{{$child->id}}">
                  -- {{$child->name}}
              </option>
          @endforeach
       @endforeach
 </select>

【讨论】:

  • 如果我使用您的代码,它会收到类似的错误 尝试获取非对象的属性“id”(查看:F:\laragon\www\flipcart\resources\views\admin \products\product.blade.php)
  • @TareqAhmed 在 wheesnoza 的回答中,如果您的父母重复,如果他们在数据库中的位置不同,您将遇到这样的问题
  • 如果你的代码,只有类别来,子类别不来
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多