Цикл по модели Laravel с двумя моделями

#php #mysql #laravel-4

#php #mysql #laravel-4

Вопрос:

Я пытаюсь найти наилучший способ подойти к этому. У меня есть две модели, одна категории, а другая инвентаризация. Я хочу выполнить поиск по категории, и каждый продукт (инвентарь), который соответствует этой модели категории, отображается в результатах поиска, ограниченных 20 страницами. Я могу получить $ category из $ cat без проблем. Я просто не уверен, что самый простой способ выполнить цикл через каждую из них с моделью инвентаря. У Eloquent есть что-то простое для этого? Я также не знаю, как это повлияет на разбивку на страницы

 public function showCategory($cat) {

    $category = Categories::where('category', '=', $cat)->get();

    $inventory = Inventory::where('sku', '=', $category)->paginate(20);

    $image = Images::where('sku', '=', $category->sku)->first();

    if (is_null($inventory)) {
        return App::abort(404);
    }
    return View::make('inventory.category', array('pageTitle' => $category->category, 'inventory' => $inventory, 'category' => $category, 'image' => $image));
}
  

итак, если категория имеет, скажем, soccer в качестве своей категории, я хочу, чтобы каждый продукт (инвентарь), который соответствует тому же артикулу из модели категорий, отображался в результате

Категория

 id name sku category
1  Blah  1234  soccer
2  Blah  2222  bball
3  Blah  3333  baseball
4  Blah  4444  soccer
5  Blah  5555  soccer
  

результаты, которые я хотел бы собрать, отображались бы примерно так из таблицы инвентаризации

инвентаризация

 id    name   sku   more_stuff_ineed
1454   Blah  1234  blah
43546  Blah  4444  blah
54567  Blah  5555  blah
  

Ответ №1:

В основном просто убедитесь, что ваши отношения определены правильно (я бы лично назвал модель инвентаризации Product вместо этого, поскольку вы имеете дело с Product, а не с Inventory .. или, может быть, InventoryItem ..)

Итак, допустим, у вас есть модель категории и модель продукта; вы бы определили свои модели следующим образом:

 class Product extends Eloquent {

    public function category()
    {
        return $this->belongsTo('Category');
    }
}

class Category extends Eloquent {

    public function product()
    {
        return $this->hasMany('Product')
    }

}
  

Это предполагает, что ваш продукт имеет, среди остальных своих данных, столбец с именем «category_id», который является тем, как он будет связан с категорией. В этом случае мы предполагаем отношение «один ко многим». если вы решите, что хотите, чтобы продукт принадлежал нескольким категориям, вам нужно будет исследовать отношения «многие ко многим» и иметь дополнительную третью таблицу для хранения отношений.

После того, как вы определили свои модели подобным образом, вы можете запрашивать продукты, которые принадлежат к категории, подобной so:

 $products = Product::where('category_id', $catId)->paginate(20);
  

Убедитесь, что вы ознакомились с документацией по связям Eloquent, показанной здесь, и полностью понимаете различные типы связей. У вас должен быть надежный дескриптор, чтобы убедиться, что ваши таблицы определены правильно, и ваши модели, и, конечно, что ваш код использует правильный синтаксис для запроса к ним.

p.s. Я заметил, что вы назвали свои модели во множественном числе. Обычно соглашение об именовании, ожидаемое от Eloquent, — это модели в единственном числе с PascalCase и именами таблиц во множественном числе (в нижнем регистре). Таким образом, ваши базовые таблицы sql для моего примера будут называться «категории» и «продукты», в то время как модели будут называться «Продукт» и «Категория».

Комментарии:

1. Спасибо за подробный ответ. Однако я не знаю, что я делаю не так с этими отношениями, но я не могу заставить их работать. Я смог заставить его работать с этим. $category = Inventory::join(‘inventory_categories’, ‘inventory.sku’, ‘=’, ‘inventory_categories.sku’) -> где (‘inventory_categories.category’, ‘=’, $cat) -> где (‘inventory.active’, ‘=’, ‘0’) -> разбиение на страницы(20); …. Но я бы хотел, чтобы он лучше работал с моделями.

2. Большая часть того, чтобы заставить Eloquent работать, — это правильное присвоение имен. Ваши файлы должны иметь правильные имена, ваши модели (и их классы) и столбцы в схеме, которые определяют взаимосвязь. Именование, которое я изложил в своем посте, должно работать; просто убедитесь, что у вас есть файлы с такими же именами, что и у классов. Кроме того, вы можете не захотеть использовать ‘sku’ в качестве столбца, который определяет ваши отношения, вы хотите, чтобы это был столбец со ссылкой на столбец идентификатора другой таблицы, такой как «category_id», который я предложил поместить в вашу таблицу продуктов.

3. Честно говоря, я не думаю, что у вас должен быть ‘sku’ как в продукте, так и в категории. Если у категории нет собственного артикула, похоже, что артикул должен принадлежать продукту и только продукту. Мне кажется, что вам, возможно, потребуется сделать шаг назад и пересмотреть, как проектировать реляционную базу данных в целом, а затем посмотреть, как Eloquent помогает при работе с ней.

4. Спасибо за ваши комментарии. Я рассмотрю это. Я работаю с таблицами, которые я не могу контролировать. У каждой из них есть свой собственный идентификатор, а артикул — это их взаимосвязь. Я ничего не могу с этим поделать.

5. О, хорошо, я думал, вы определяете схему .. если вы не можете изменить это, чтобы придать больше смысла, тогда вам придется делать то, что вы делаете, и вручную использовать конструктор запросов для работы с вашей схемой. Обычно в реляционных базах данных вы используете столбец типа someothertable_id для ссылки на другую таблицу, и в зависимости от того, есть ли у вас связь «многие ко многим» или нет, вам понадобится только один идентификатор, чтобы установить ссылку между двумя таблицами; Eloquent работает на основе этих предположений.. однако вы можете переопределить связанные столбцы, определив их в своих вызовах ‘belongsTo’ и ‘hasMany’; возможно, попробуйте это.