Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 26.07.2013 15:47:34

Как это можно реализовать?

Допустим имеется товар, а у него могут быть форматы 80х90, 90х30. У каждого товара может быть разное кол-во форматов и их может быть несколько. Как такое сделать так и не додумался. А возможно ли все занести в одну Mysql ячейку и потом как-то её расфасовать?

Пробовал запрос такого вида

INSERT INTO `products`(`formats`) VALUES ([value-1]),([value-2]);

Он создает 2 новые строки значит не подойдет.

Так ну можно сделать так:
Привязку по id опять же и в отдельную таблицу заносить все форматы соответствующего товара. Ну тогда нужно сделать дофигища ячеек на всякий случай ведь я не знаю точного кол-во форматов.

Изменено umarov (26.07.2013 15:57:35)

Не в сети

#2 26.07.2013 17:15:40

Re: Как это можно реализовать?

Таблица с товарами (id, name, image, …) и таблица с товарами по форматам (product_id, format_id, …). В чём вопрос?

Не в сети

#3 26.07.2013 17:20:20

Re: Как это можно реализовать?

Proger_XP пишет:

}%Таблица с товарами (id, name, image, ...) и таблица с товарами по форматам (product_id, format_id, ...). В чём вопрос?

Не понял. 3 таблицы что ли создавать нужно?

Изменено umarov (26.07.2013 17:22:34)

Не в сети

#4 26.07.2013 17:33:38

Re: Как это можно реализовать?

Если у тебя есть товар, а у него есть вариации, и товар хранится в таблице — логично создать вторую и хранить там только вариации. Либо сделать поле в первой и держать вариации там (serialize() и пр.), но тогда по ним нельзя будет выполнять запросы.

Не в сети

#5 26.07.2013 21:32:29

Re: Как это можно реализовать?

  1. Если у тебя есть товар, а у него есть вариации, и товар хранится в таблице — логично создать вторую и хранить там только вариации. Либо сделать поле в первой и держать вариации там (serialize() и пр.), но тогда по ним нельзя будет выполнять запросы.

Еще один глупый вопрос:
Есть фильтр например:

  1. Керамика.
  2. Мозайка
  3. Стеклянная мозайка

Дальше идут производители

  1. Производитель 1
  2. Производитель 2

В каждом из производителей может находиться несколько типов продукции, а может только одна. Все было бы просто, но я не хочу выводить всех производителей. Я хочу сделать чтобы по нажатию керамика выходили только производители содержащие керамическую продукцию. Пробовал по разному. Например в таблице с продукцией создавал type_id и manufacturers_id. По нажатию на фильтр проверялся type_id, а вот дальше трудности. Этот прием видимо не верен. Так же как и прием с созданием отдельной таблицы с type_id — пробовал.

Не в сети

#6 27.07.2013 07:41:12

Re: Как это можно реализовать?

Я бы сделал 3 таблицы: производители (id, название, адрес, …), товары (id, название, вес, описание, …), типы (id, название, описание, …). К ним добавляем ещё одну таблицу — собственно каталог: manufacturer_id, product_id, type_id, … (остаток_на_складе, заказов_за_месяц и ещё какие-то специфичные для производителя поля).

Таблица-каталог связана с тремя другими отношениями много-к-одному. Все три поля_id могут быть вместе уникальным ключом. При выборке из каталога используются JOIN.

Не в сети

#7 27.07.2013 15:31:01

umarov131

Re: Как это можно реализовать?

Такое дело: Если не передавать в вид то все работает выводятся производители заданной категории, но когда выводишь в вид выводиться только одна. Очень интересно когда выводишь массив через print_r в контроллере не передавая в вид то выводится как положено, а как только передаешь в вид то выводится одна это при том что print_r в контролере и стоит выше view::make

#8 27.07.2013 15:34:51

umarov131

Re: Как это можно реализовать?

Вот код

	public function get_index($id) {

		$chek_id = DB::table('collection')
			    ->left_join('manufacturers', 'manufacturers.id', '=', 'collection.type_id')
			    ->where('collection.type_id', '=', $id)
			    ->get('manufacturers_id');
			    
		foreach ($chek_id as $id) {

			$manufacturers = Manufacturers::where('id', '=', $id->manufacturers_id) -> get();

			print_r($manufacturers);

			return View::make('home.manufacturers') -> with('manufacturers', $manufacturers);

		} 


	} 

#9 27.07.2013 15:50:10

Re: Как это можно реализовать?

Извини нужно было сразу залогинится. var_dump возвращает 2 массива. Почему и в контролере выдается 1 результат понял. Это из-за return внутри foreach

Изменено umarov (27.07.2013 16:08:36)

Не в сети

#10 27.07.2013 16:07:22

Re: Как это можно реализовать?

Не могу ничего сказать. Возьми отладчик и пройдись по циклу, в таких случаях это куда быстрее, чем ждать ответа на форуме.

Не в сети

#11 27.07.2013 16:19:12

Re: Как это можно реализовать?

Proger_XP пишет:

}%Не могу ничего сказать. Возьми отладчик и пройдись по циклу, в таких случаях это куда быстрее, чем ждать ответа на форуме.

Во всей видимости это из за return. Нужно передать 3 объекта в вид. Причем они могут пополнятся значит в цикле. А как? Да это именно объекты так и написано manufacturers object

Изменено umarov (27.07.2013 16:23:02)

Не в сети

#12 27.07.2013 18:16:08

Re: Как это можно реализовать?

  1. Во всей видимости это из за return.

Ну ты даёшь. Я думал у тебя объект меняется при передаче в шаблон или ещё что-то.

В чём проблема с циклом? Либо передавай в шаблон массив всех нужных объектов, либо вызывай шаблон для каждого объекта, а результаты склеивай в строку. Я бы выбрал первый вариант: создаёшь отдельный шаблон тиа home.manufacturers или manufacturers.list, который вызывает в цикле шаблон home.manufacturer или manufacturers.info.

Не в сети

#13 27.07.2013 19:41:56

Re: Как это можно реализовать?

Proger_XP пишет:

}%> Во всей видимости это из за return.
Ну ты даёшь. Я думал у тебя объект меняется при передаче в шаблон или ещё что-то.

В чём проблема с циклом? Либо передавай в шаблон массив всех нужных объектов, либо вызывай шаблон для каждого объекта, а результаты склеивай в строку. Я бы выбрал первый вариант: создаёшь отдельный шаблон тиа %%home.manufacturers%% или %%manufacturers.list%%, который вызывает в цикле шаблон %%home.manufacturer%% или %%manufacturers.info%%.

Проблема в том что когда я ввожу return view::make чтобы передать переменную в вид передается почему то один объект как только я убираю return view::make то выводится как положено все объекты Дело в том что это не целый массив. Посредством этих манипуляций возвращается 3 массива(объекта) которые я и так

public $restful = true;

	public function get_index($id) {

	$chek_id = DB::table('collection')
					->left_join('manufacturers', 'manufacturers.id', '=', 'collection.type_id')
					->where('collection.type_id', '=', $id)
					->get('manufacturers_id');

		for ($i = 0; $i < count($chek_id); $i++) {

			$manufacturers = Manufacturers::where('id', '=', $chek_id[$i]->manufacturers_id) -> get();

		}
		return View::make('home.manufacturers') -> with('manufacturers', $manufacturers);

	}
}

перебрать. Но я чего то не так делаю. Может их объединить сначала нужно. Я конечно знаю функцию объединение массивов, но вот объединить их я не смог. Массив вида. Получается в цикле for несколько раз присваивается значение массива в $manufacturers и все  она потом теряется а рендерить вид десять раз не то, да и пробывал рендер вида в цикл занести тоже не выходитю Афигеть что же делать(((

Array
(
    [0] => Manufacturers Object
        (
            [attributes] => Array
                (
                    [id] => 1
                    [title] => ABK
                    [logo] => ABK.jpg
                    [preview_img] => preview_abk.jpg
                    [desc] => Плитка от производителя ABK самая лучшая в мире!!!
                )

            [original] => Array
                (
                    [id] => 1
                    [title] => ABK
                    [logo] => ABK.jpg
                    [preview_img] => preview_abk.jpg
                    [desc] => Плитка от производителя ABK самая лучшая в мире!!!
                )

            [relationships] => Array
                (
                )

            [exists] => 1
            [includes] => Array
                (
                )

        )

)
Array
(
    [0] => Manufacturers Object
        (
            [attributes] => Array
                (
                    [id] => 2
                    [title] => Cavalli
                    [logo] => cavalli.jpg
                    [preview_img] => preview_abk.jpg
                    [desc] => Ahuennaya plita ot Roberto
                )

            [original] => Array
                (
                    [id] => 2
                    [title] => Cavalli
                    [logo] => cavalli.jpg
                    [preview_img] => preview_abk.jpg
                    [desc] => Ahuennaya plita ot Roberto
                )

            [relationships] => Array
                (
                )

            [exists] => 1
            [includes] => Array
                (
                )

        )

)

Изменено umarov (27.07.2013 20:16:28)

Не в сети

#14 27.07.2013 20:33:25

Re: Как это можно реализовать?

По-моему тебе надо подучить PHP. У тебя в цикле переменная $manufacturers трижды перезаписывается. Естественно там сохраняется только последний объект. С return аналогично, только наоборот — возвращается первый объект.

Не в сети

#15 27.07.2013 20:38:27

Re: Как это можно реализовать?

  1. По-моему тебе надо подучить PHP. У тебя в цикле переменная $manufacturers трижды перезаписывается. Естественно там сохраняется только последний объект. С return аналогично, только наоборот — возвращается первый объект.

любой цикл перезапишет тебе переменную

Не в сети

#16 27.07.2013 20:54:53

Re: Как это можно реализовать?

Что я хочу сделать. Я с помощью этого запроса

$chek_id = DB::table('collection')
					->left_join('manufacturers', 'manufacturers.id', '=', 'collection.type_id')
					->where('collection.type_id', '=', $id)
					->get('manufacturers_id');

Вытаскивал manufacturers_id где все type_id = $id. То есть есть например категория керамика с id=1 который передается в url. Так же есть type_id в таблице продукция вот с ней то и сравнивается $id. Дальше вытаскиваются все manufacturers_id где type_id = $id. А потом мне нужно вытащить всех производителей где id = manufacturers_id. Этот manufacturers_id как видно из запроса записывается в переменную $chek_id. Дальше эту переменную нужно прогнать в цикле потому что возвращаемых данных может быть больше 1 как мы и наблюдали. А иначе как иначе никак. И дальше уже делать запрос такого вида

Manufacturers::where('id', '=', $chek_id[$i]->manufacturers_id) -> get();

Решение найдено:

<?php

class Manufacturers_Controller extends Base_Controller {

public $restful = true;

	public function get_index($id) {

    $chek_id = DB::table('collection')
          ->left_join('manufacturers', 'manufacturers.id', '=', 'collection.type_id')
          ->where('collection.type_id', '=', $id)
          ->get('manufacturers_id');
        
   $manufacturers = array();

    foreach ($chek_id as $id) {
      $manufacturers[] = Manufacturers::where('id', '=', $id->manufacturers_id) -> get();
    }
    
    return View::make('home.manufacturers') -> with('manufacturers', $manufacturers);
  } 


}

Изменено umarov (27.07.2013 21:34:51)

Не в сети

#17 28.07.2013 06:46:25

Re: Как это можно реализовать?

Всё же тебе стоит подучить PHP.

Кроме того, весь цикл можно заменить на один запрос.

PHP
$getID = function ($id) { return $id->manufacturers_id); };
$manufacturers Manufacturers::where_in('id'array_map($getID$chek_id))->get();

Не в сети

#18 28.07.2013 17:59:33

Re: Как это можно реализовать?

Как думаешь целесообразно будет корзину с помощью кеша реализовать — chache?

Не в сети

#19 28.07.2013 22:50:29

umarov1

Re: Как это можно реализовать?

	public function post_card($id) {

		Cookie::put('title', Input::get('title'), 60);

		return Redirect::to('/');

	}

нужно корзину реализовать. В этом скрипте получаем title нужного товара и записываем его в куку. Проблема в следующем: Если я добавляю в корзину другой товар кука конечно же перезаписыватся. Да ты прав php выучить нужно

Подвал раздела