Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Структура БД такая:
categories(id, parent_id, name, slug, ...)
products(id, category_id, name, slug, price, ...)
в AppServiceProvider пропиши в методе boot() переменную и верни в шаблон через фасад View:
public function boot()
{
$my_var = 'Hello, world';
View::share([
'my_var' => $my_var ,
]);
}
Модель:
class Category extends Model
{
use Sluggable;
public function sluggable(): array
{
return [
'slug' => [
'source' => 'name'
]
];
}
public function parent()
{
return $this->belongsTo(Category::class, 'parent_id');
}
public function categories()
{
return $this->hasMany(Category::class, 'parent_id');
}
public function children()
{
return $this->hasMany(Category::class, 'parent_id')->with('categories');
}
public function products()
{
return $this->hasMany(Product::class);
}
}
Контроллер
class CategoryController extends Controller
{
public function show($slug)
{
$category = Category::where('slug', $slug)->first();
$products = $category->products()->orderBy('created_at')->paginate(12);
return view('category.product', [
'products' => $products,
'category' => $category
]);
}
}
Данный код выводит все товары одной категории, по ключу slug. Но проблема в том, что категории могут быть вложенные и мне надо, чтобы выводились все товары, в том числе дочерних (если есть) категорий. Например, если выбрать родительскую категорию, то показать список всех товаров (в том числе товары дочерних категорий), а если выбрать только дочернюю категорию, то показать только те товары, которые находятся в данной дочерней категории. Как реализовать такой метод?
я могу получить сумму всех заказов следующим способом:
$orders = Order::sum('sum');
Но как получить сумму заказов за сегодняшнюю дату?
А как насчет защиты пользовательских данных?
в данном случае приложение будет являться что-то вроде хелпдеск-системой и администратор сам будет добавлять пользователей, но в то же время у пользователей будет возможность самостоятельно зарегаться, если администратор в настройках приложения включит эту возможность.
как в админке изменить пароль пользователя в модальном окне? на текущий момент в моем приложении на странице редактирования можно изменить персональные данные пользователя кроме пароля. теперь я хочу реализовать изменение пароля пользователя, чтобы при клике на ссылку "изменить пароль" открывалось модальное окно и в форме ввода ввести новый пароль. нужно ли создавать отдельный метод в контроллере или можно это реализовать в одном методе update()?
Метод update
public function update(Request $request, $id)
{
$request->validate([
'login' => 'required',
'first_name' => 'required',
'last_name' => 'required',
]);
$user = User::find($id);
$data = $request->all();
$user->update($data);
return redirect()->route('user.index')->with('success', 'Изменения сохранены');
}
Вид edit
<div class="content">
<div class="container-fluid">
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">Редактирование пользователя</h3>
</div>
<form role="form" method="post" action="{{ route('user.update', ['user' => $user->id]) }}" >
@csrf
@method('PUT')
<div class="card-body">
<div class="form-group">
<label for="login">Логин</label>
<input type="text" name="login" class="form-control @error('login') is-invalid @enderror" value="{{ $user->login }}">
<a href="#" data-toggle="modal" data-target="#modal-default">Изменить пароль</a>
</div>
<div class="form-group">
<label for="email">E-mail</label>
<input type="text" name="email" class="form-control @error('email') is-invalid @enderror" value="{{ $user->email }}">
</div>
<div class="form-group">
<label for="first_name">Фамилия</label>
<input type="text" name="first_name" class="form-control @error('first_name') is-invalid @enderror" value="{{ $user->first_name }}">
</div>
<div class="form-group">
<label for="last_name">Имя</label>
<input type="text" name="last_name" class="form-control @error('last_name') is-invalid @enderror" value="{{ $user->last_name }}">
</div>
<div class="form-group">
<label for="middle_name">Отчество</label>
<input type="text" name="middle_name" class="form-control @error('middle_name') is-invalid @enderror" value="{{ $user->middle_name }}">
</div>
<div class="form-group">
<label for="role_id">Роль</label>
<select name="role_id" class="form-control">
<option value="">пользователь</option>
@foreach($roleList as $role)
<option value="{{ $role->id }}" @if($role->id == $user->role_id) selected @endif>{{ $role->name }}</option>
@endforeach
</select>
</div>
</div>
<div class="card-footer">
<button type="submit" class="btn btn-primary">Сохранить</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="modal-default">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Изменение пароля</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div class="input-group mb-3">
<input type="password" name="password" class="form-control" placeholder="Введите новый пароль">
</div>
<div class="input-group mb-3">
<input type="password" name="password_confirmation" class="form-control" placeholder="Подтвердите новый пароль">
</div>
</div>
<div class="modal-footer justify-content-between">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
поизучал документацию, оказывается связанные данные можно вытащить конструктором запросов:
$postList = DB::table('posts')->select('posts.id', 'posts.title', 'posts.text', 'users.login as username', 'posts.created_at')
->join('users', 'posts.user_id', '=', 'users.id')->get();
Хочу получить все записи из таблица posts, которая связана по внешнему ключу с таблицей users, но получаю ошибку "Неопределенное свойство $user
Модель User
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
//
public function about()
{
return $this->belongsTo(Posts::class);
}
}
Модель Posts
class Posts extends Model
{
use HasFactory;
public function user()
{
return $this->hasMany(User::class);
}
}
PostController
public function index()
{
$postList = DB::table('posts')->join('users', 'posts.user_id', '=', 'users.id')->get();
return view('admin.post.index', compact('postList'));
}
View
@foreach($postList as $item)
<tr>
<td>{{ $item->id }}</td>
<td>{{ $item->title }}</td>
<td>{{ $item->text }}</td>
<td>{{ $item->user->login }}</td>
<td>{{ $item->created_at }}</td>
</tr>
@endforeach