Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
По дефолту можно сделать что-то в этом духе:
return redirect('products/1');
Тем самым пользователь перейдёт на страницу ’products/1’. Но как быть, если эту единичку я храню в переменной? Как можно вторую часть юрл передать переменной? Что-то вроде этого что бы было:
$id = 1;
return redirect('products/' + $id);
решил с помощью сессий
Каким образом возможно создать глобальную переменную в классе, что бы в дальнейшем можно было получать и изменять её значение?
Сделал через query builder и с помощью массива передал те параметры. Всё теперь работает
Когда в phpMyAdmin делаю следующий SQL запрос:
SELECT products.id FROM products, characteristics
WHERE products.id = characteristics.pr_id AND products.c_id = 1
AND characteristics.value IN ('8-core', 'Quad-Core')
AND price BETWEEN 50 AND 5000 GROUP BY products.id
Всё работает правильно. А когда в модели пытаюсь это сделать следующим образом, то на выходе получаю пустой массив
$products = DB::select('SELECT products.id FROM products, characteristics
WHERE products.id = characteristics.pr_id AND products.c_id = ?
AND characteristics.value IN (?)
AND price BETWEEN ? AND ? GROUP BY products.id', [$catId, $query, $minPrice, $maxPrice]);
dd($products);
В чём может быть проблема?
PS: если во втором случае передавать только один параметр с помощью переменной $query(например 'Quad-Core') то выдаёт правильный результат. Но как только передаю два и более, то получаю пустой массив.
Контроллер:
$values = Input::get('value');
$category = Input::get('cat');
$brand = Input::get('brand');
$minPrice = Input::get('min_price');
$maxPrice = Input::get('max_price');
$query = implode('", "', $values);
$product = new Product();
$products = $product->getProductsByPar($query, $minPrice, $maxPrice, $category, $brand);
Модель
public function getProductsByPar($query, $minPrice, $maxPrice, $cat, $brand)
{
$category = new Category();
$brands = new Brand();
$minPrice = (int)$minPrice;
$maxPrice = (int)$maxPrice;
$catId = $category->getCategoryId($cat)->id;
if($brand == 'none')
{
$products = DB::select('SELECT products.id FROM products, characteristics
WHERE products.id = characteristics.pr_id AND products.c_id = ?
AND characteristics.value IN (?)
AND price BETWEEN ? AND ? GROUP BY products.id', [$catId, $query, $minPrice, $maxPrice]);
}
else
{
$brandId = $brands->getBrandId($brand)->id;
$products = DB::select('SELECT products.id FROM products, characteristics
WHERE products.id = characteristics.pr_id AND products.c_id = ?
AND products.b_id = ? AND characteristics.value IN (?)
AND price BETWEEN ? AND ? GROUP BY products.id', [$catId, $brandId, $query, $minPrice, $maxPrice]);
}
dd($products);
return $products;
что имеется в виду?
Всем спасибо, уже работает:
$getAll = DB::table('categories')
->leftJoin('products', 'products.c_id', '=', 'categories.id')
->leftJoin('brands', 'brands.id', '=', 'products.b_id')
->groupBy('brands.name')
->groupBy('categories.name')
->get([
'categories.id as id',
'categories.name as cat',
'brands.name as brand'
]);
$categories = [];
if (count($getAll)) {
foreach ($getAll as $single) {
if (!isset($categories[$single->id])) {
$categories[$single->id] = new \StdClass();
}
$categories[$single->id]->cat = $single->cat;
$categories[$single->id]->brands[] = $single->brand;
}
}
//View
@foreach($categories as $category)
<li><a>{{ $category->cat}}</a>
<ul class="sort-section">
<li><a href="#"><strong>All {{$category->cat}}</strong></a></li>
@foreach($category->brands as $brand)
<li><a href="#">{{ $brand }}</a></li>
@endforeach
</ul>
</li>
@endforeach
На въюхе у меня должно быть два цикла: один выводит все категории, второй, который находится внутри первого, выводит все бренды данной категории. Пример:
//model
$categories = DB::table('products')
->join('categories', 'products.c_id', '=', 'categories.id')
->select('categories.name as cat')
->groupBy('categories.name')
->get();
$brands = DB::table('products')
->join('categories', 'products.c_id', '=', 'categories.id')
->join('brands', 'products.b_id', '=', 'brands.id')
->select('brands.name as brand')
->where('categories.id', '=', '1')<-- об этом речь пойдёт ниже
->groupBy('brands.name')
->get();
//view
@foreach($categories as $category)
<li><a>{{ $category->cat }}</a>
<ul class="sort-section">
<li><a href="#"><strong>All CPUs</strong></a></li>
@foreach($brands as $brand)
<li><a href="#">{{ $brand->brand }}</a></li>
@endforeach
</ul>
</li>
@endforeach
Проблема заключается в выделенной мною строчкой в модели. Я "выбираю" записи, где `id` категории = 1(проверял или всё остальное работает), когда на самом деле мне нужно выбирать `id` поточной категории(поточной на въюхе). Другими словами, если бы я это делал по-простому и по-неправильному, то я бы второй запрос осуществлял бы внутри первого `foreach` на въюхе. Каким образом можно решить данный вопрос?
Но, всё таки, следующий код в контроллере является правильным:
ScheduleRelation::insert(['s_id' => $id, 'u_id' => $user->id]);
Schedule::where('id', '=', $id)->decrement('slots');
?
Ну вот так как раз таки в основном и работают с БД в контроллерах.
Например:
App\Flight::where('active', 1)
->where('destination', 'San Diego')
->update(['delayed' => 1]);
Я понимаю, что так удобнее, но мне интересно или разумно производить похожие запросы прямо в моделе? (я пишу диплом и боюсь что ларавельный подход к моделям могут на комиссии не понять)
}
Например?
Возможно где-то для упрощения просто приводят, когда упор на что-то другое
Ну вот за месяц работы с документацией я не нашёл примера, где обращаются с запросом к БД в моделе. И теперь я не могу толком понять как это сделать.
Сначала я так же все запросы писал в контроллерах, но теперь хотел бы разделить работу с БД от контроллеров.
И хотел бы получить совет на таком простом примере:
Раньше у меня был следующий код в контроллере:
DB::table('items')->insert(['name' => $name, 'size' => $size, 'color' => $color] );
Как мне теперь по людски реализовать то же самое, только отдельно в моделе, а в контроллере только вызвав метод с модели?
Неужели так:
контроллер
$item = new Item();
$item->newUser($name, $size, $color);
модель Item
public function newItem($name, $size, $color)
{
DB::table('items')->insert(['name' => $name, 'size' => $size, 'color' => $color] );
}
В MVC нужно всю работу с БД переносить в модели. Но во всех примерах в документации запросы делают в контроллерах.
Так где же на самом деле следует работать с БД?
Оу. Сейчас попробую. В остальных подобных случаях всё и так работало нормально. Просто я в примерах где -то когда-то так увидел и с тех пор везде так писал.
Очень странная ситуация — время от времени ларавель ругается, на то, что используется не объявленная переменная. Переменные я передаю с контроллера на представление следующим образом:
return view('pages.schedule', ['items' => $items], ['user' => $user], ['relation' => $relation]);
Самое странное здесь то, что ларавель ругается только на последнюю передаваемую переменную. И достаточно просто поменять последнюю передаваемую переменную местами с какой либо другой и ошибка на какое-то время пропадает. А затем снова появляется. И приходится делать всё заново.
Что это вообще может быть и как это исправить? Поиск давал результаты только связанные со стандартной переменной $errors
тебе рановато говорить другим, чем им заниматься.
не ну писать самому пагинатор, когда меня не устраивает только символы внутри ссылки это туповато.
laravelNewbie пишет:hzone пишет:исходники в директории vendor править не стоит, ибо composer update все ваши старания по*#*#т к чёрту
ну а какие тогда ещё варианты?
писать самому, не?
можно вообще на чистом php писать, чё уж с фреймворками заморачиваться.
исходники в директории vendor править не стоит, ибо composer update все ваши старания по*#*#т к чёрту
ну а какие тогда ещё варианты?
Это я конечно по жёсткому затупил. Но ещё вопрос: мне нужно убрать каким-то образом эти стрелочки. Такое возможно?(просто когда видел заготовки стилей в интернете, то там всё равно везде эти стрелочки оставались)
PS: уже нашёл. в файлах пагинатора удалил эти символы и теперь всё как надо. Надеюсь это правильный подход.
Использую simplePaginate, но не могу найти пример изменения визуального оформления ссылок. Каким образом можно задать стили для ссылок?
Я дурачёк. Сделал следующим образом:
@foreach($items as $item)
<?php
$time = new DateTime($item->dtime);
$i = $time->format('H:i');
?>
<div class="schedule-item">
<div class="s-time">{{ $i }}</div>
</div>
@endforeach
Если это слишком тупо, то критика приветствуется.
В представлении через foreach вывожу DateTime с БД. Но мне нужно выводить только часы и минуты. Не могу понять как и где это форматирование задать.
Контроллер:
$items = DB::table('schedule')
->orderBy('dtime', 'asc')
->get();
return view('pages.schedule', ['items' => $items]);
Представление:
@foreach($items as $item)
<div class="schedule-item">
<div class="s-time">{{ $item->dtime }}</div>
</div>
@endforeach
Я знаю, что можно задать желаемый формат следующим образом:
$time = new \DateTime($item->dtime);
$i = $time->format('H:i'));
Но не могу понять, как это реализовать по человечески.
Ну так я это уже всё давно реализовал. Просто было достаточно сказать, что такое по дефолту не предусмотрено и всё. А не рассказывать мне о том, что я не умею искать то, чего нет.
Рано вам фреймворками заниматься, если сами не понимаете КАК найти необходимые методы.
может ты имеешь в виду, что я не могу найти несуществующие во фреймворке методы?