Как получить N записей из модели на одного родителя?В Ларавел красноречивый - PullRequest
0 голосов
/ 08 июня 2018

Как я могу получить n записей из модели на одного родителя в laravel eloquent.

Например, допустим, у меня есть таблица products и таблица categories.И мне нужен список всех продуктов, название которых начинается с A, но не более 10 продуктов на category.

Моя структура таблицы примерно такая.

таблица продуктов

---------------------------------
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) для операции '=' (SQL: выберите количество(*) как совокупность от ...

Может кто-нибудь сказать, как я могу получить n результатов для связанной модели или как я могу исправить эту ошибку.

Ответы [ 4 ]

0 голосов
/ 30 октября 2018

В 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();
0 голосов
/ 08 июня 2018

Сначала давайте создадим ваши модели:

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);
    }
}

Используя eloquent, вы получите следующее:

$Category = Category::get();

Вы можететакже используйте starts_with() для определения столбца, слово

0 голосов
/ 08 июня 2018

Насколько я понимаю, для каждого 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;

Единственный недостаток, который я вижу в этом, - это циклы для каждого идентификатора категории, что может занять больше времени, если у вас есть тысячи записей.Вы можете использовать любой другой ключ, кроме $ category-> id, если хотите показать его в своем блейд-файле.

0 голосов
/ 08 июня 2018

Передача запроса при вызове отношения:

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

Предполагается, что у вас есть отношение в модели категории.

public function products()...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...