使用关联表中的值创建下拉列表

时间:2015-10-26 15:28:04

标签: laravel laravel-5 eloquent

我的模型产品返回类似这样的内容

  • id = 1
  • name =产品名称
  • category_id = 101
  • category = array
    • id = 101
    • name = electronics

我需要使用lists()来创建这样的内容:

  

列出(" category.name"," id")

但看起来这是不可能的。如何为下拉列表创建列表:

1 = electronics
2 = furniture
3 = cars
...

非常感谢

1 个答案:

答案 0 :(得分:1)

你确定你确实建立了正确的关系吗?因为这正是lists()通常所做的事情,并且创建这样的列表远非不可能 如果没有你的代码,你很难理解你是如何设计你的Eloquent逻辑的,但是在这里我将如何处理你的情况,假设你已经设置了category_product数据透视表。
鉴于两个模型ProductCategory,我定义了这两个关系的原因,据我所知,一个产品可以有几个类别,一个类别可以与几个产品相关联:

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

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

此时,你很高兴,你需要做的就是获取你的清单

Product::findOrFail($id)->categories->lists('name','id')  

这将返回一个包含与给定产品相关的所有类别的数组

array:[
    1 => first-category
    2 => second-category
    3 => third-category
    ....
  ]  

请注意,通过此设置,如果您想获得与给定类别匹配的所有产品的列表,它也可以反过来工作

Category::findOrFail($id)->products->lists('name','id')  

在答案的最顶端,我假设你确实设置了一个数据透视表,但是,如果你没有,这里有一个快速提示: 在您的产品迁移中

public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            //
        });

        Schema::create('category_product', function (Blueprint $table){
            $table->integer('category_id')->unsigned()->index();
            $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');

            $table->integer('product_id')->unsigned()->index();
            $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');

            $table->timestamps();
        });
    }  

然后migrate现在一切都已正确设置。最后但并非最不重要的是,如果您要使用此迁移,您需要修复模型中的关系,哪一个取决于您的应用程序逻辑:让我们说流程是创建一个新产品 - >选择创建表单中的类别,然后您需要在类别方法

中添加timestamps()
return $this->belongsToMany('App\Category')->withTimeStamps();