如何从每个父母的模型中获取N条记录?在laravel雄辩

时间:2018-06-08 13:27:53

标签: php mysql laravel laravel-5 eloquent

如何在laravel雄辩中从每个父母的模型中获取n条记录。

例如,假设我有 products 表和 categories 表。我希望列出所有名称以A开头但每个category不超过10个产品的产品。

我的表结构是这样的。

产品表

---------------------------------
id  | title | slug | category_id
----------------------------------

类别表

--------------
id  | title |
--------------

我试着遵循这个例子,这正是我想要的 https://softonsofa.com/tweaking-eloquent-relations-how-to-get-n-related-models-per-parent/

但是当我在product model中添加范围后,我尝试查询链接中的示例。抛出和sql错误说。

  

SQLSTATE [HY000]:常规错误:1267非法混合排序规则   (utf8mb4_unicode_ci,IMPLICIT)和(utf8mb4_0900_ai_ci,IMPLICIT)   operation'='(SQL:从...中选择count(*)作为聚合

任何人都可以告诉我如何获得每个相关模型的n个结果,或者我该如何解决这个错误。

4 个答案:

答案 0 :(得分:0)

调用关系时传递查询:

Category::with(['products' => function($query){
    $query->take(10)->skip(0);
}])->get();

假设您的类别模型中存在关系。

public function products()...

答案 1 :(得分:0)

首先让我们创建你的模型:

class Category extends Model
{
    public $timestamps = false;

    protected $fillable = [

       'title'];

    public function products(){
    return $this->hasMany(\App\Products::class)->limit(10);
}
}

和第二个:

class Products extends Model
{
    public $timestamps = false;

    protected $casts = [
        'category_id' => 'int',
    ];

    protected $fillable = [

       'title',
        'slug'
    ];

    public function category()
    {
        return $this->belongsTo(\App\Category::class);
    }
}

使用雄辩,以下是:

$Category = Category::get();

您还可以使用starts_with()来定义列

答案 2 :(得分:0)

从我看来,对于每个categoryID,您需要列出10个产品的数组。使用Eloquent,这就是我提出的

$categories = Category::all()
productsArray = array();
foreach($categories as $category) {
        $products = Product::where('category_id', $category->id)->where('title', 'LIKE', 'A%')->get();
        if(sizeof($products)) {
            $products = $products->take(10);
            $productsArray[$category->id] = $products;
        }
    }
return $productsArray;

我在此看到的唯一不利方面是每个类别ID的循环,如果您有数千条记录,可能需要更多时间。如果您希望在刀片文件中显示,则可以使用除$ category-> id以外的任何其他密钥。

答案 3 :(得分:0)

Laravel中没有对此的本地支持。

我为此创建了一个包:https://github.com/staudenmeir/eloquent-eager-limit

在父模型和相关模型中都使用HasEagerLimit特性。

class Category extends Model {
    use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
}

class Product extends Model {
    use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
}

然后,您可以将limit() / take()应用于您的关系:

Category::with(['products' => function($query) {
    $query->where('name', 'LIKE', 'A%')->limit(10);
}])->get();