#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’; возможно, попробуйте это.