Laravel whereIn with with()

Laravel whereIn with with()

我想传入 ids 数组并获取 ids 的所有 category 以及 category

的所有横幅

我在 ProductMainCategory.php 模型中定义了关系

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ProductMainCategory extends Model
{
    protected $hidden = ['created_at','updated_at'];

    public function banners()
    {
        return $this->hasMany('App\ProductCategoryBanner', 'category_id');
    }
}

ProductCategoryBanner.php 模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ProductCategoryBanner extends Model
{
    protected $hidden = ['created_at','updated_at'];
}

在我的控制器中

   //get distinct main_categories by id
    $main_category_ids = Product::whereIn('id', $product_ids)
                                ->select('main_category_id')
                                ->distinct()
                                ->pluck('main_category_id')
                                ->toArray(); 

    //get main_category with banners (error query)
    $main_categories_with_images = ProductMainCategory::whereIn('id', $main_category_ids)
                                                      ->with(array('banners'=>function($query){
                                                            $query->select('id','image');
                                                       }))
                                                      ->get();

    //this query works, but it'll give all the categories but i want only passed id's categories
    $main_categories_with_images = ProductMainCategory::with('banners')
                                                  ->get();

我正在获取数据,但横幅是空的

    [
        {
            "id": 1,
            "name": "Grocery & Staples",
            "admin_id": 1,
            "banners": [] //getting empty array
        },
        {
            "id": 2,
            "name": "Fruits & Vegetables",
            "admin_id": 1,
            "banners": [] //getting empty array
        }
    ]

//actual result without $query->select('id','image'); is
 [
    {
        "id": 1,
        "name": "Grocery & Staples",
        "admin_id": 1,
        "banners": [
            {
                "id": 1,
                "category_id": "1",
                "image": "link 1",
                "admin_id": 2
            },
            {
                "id": 2,
                "category_id": "1",
                "image": "link 2",
                "admin_id": 1
            }
        ]
    },
    {
        "id": 2,
        "name": "Fruits & Vegetables",
        "admin_id": 1,
        "banners": [
            {
                "id": 3,
                "category_id": "2",
                "image": "link 3",
                "admin_id": 1
            },
            {
                "id": 4,
                "category_id": "2",
                "image": "link 4",
                "admin_id": 1
            }
        ]
    }
]
 $main_categories_with_images = ProductMainCategory::whereIn('id', $main_category_ids)
                                                  ->with(array('banners'=>function($query){
                                                        $query->select('id','image');
                                                   }))
                                                  ->get();

WareIn更改为WhereIn

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ProductCategoryBanner extends Model
  {
  protected $hidden = ['created_at','updated_at'];

  public function mainCategory() { return $this->belongsTo('ProductMainCategory')->select(['id','image'‌​]); }
 }

你在ProductMainCategory后面打错了:wareIn(),应该是whereIn()

改变这个:

 //get main_category with banners (error query)
    $main_categories_with_images = ProductMainCategory::whereIn('id', $main_category_ids)
                                                      ->with(array('banners'=>function($query){
                                                            $query->select('id','image');
                                                       }))
                                                      ->get();