如何从每个父模型中获得n条记录?在拉威尔雄辩

aamkag61  于 2021-06-24  发布在  Mysql
关注(0)|答案(4)|浏览(279)

我怎样才能得到n个记录,从一个模型,每个家长在拉威尔雄辩。
比如说我有 products 表和 categories table。我要一份所有产品的清单谁的名字以 A 但每次不超过10种产品 category .
我的table结构是这样的。
产品表

---------------------------------
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\u unicode\u ci,隐式)和(utf8mb4\u 0900\u ai\u ci,隐式)非法混合(sql:选择count(*)作为聚合自。。。
谁能告诉我如何能得到n个结果每个相关的模型或我如何能修复这个错误。

ua4mk5z4

ua4mk5z41#

在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();
nkcskrwz

nkcskrwz2#

在我看来,对于每个categoryid,您需要列出10个产品的数组。用雄辩的语言,这就是我想到的

$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;

我在这里看到的唯一不利的一面是每个category id的循环,如果您有数千条记录,这可能需要更多的时间。如果您想在您的blade文件中显示它,您可以拥有除$category->id之外的任何其他键。

vngu2lb8

vngu2lb83#

调用关系时传递查询:

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

假设您的类别模型中有一个关系。

public function products()...
2nbm6dog

2nbm6dog4#

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

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() 要定义列,请单击word

相关问题