Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Разобрался, можно сделать как я описал выше несколько отношений и вызывать их вот так:
user::with('paramsSex','paramsStatus','paramsDrinks')
Для примера, имеются две таблицы users и params
Таблица users
id
params_status - foreign_key
params_sex - foreign_key
params_drinks - foreign_key
Таблица params
id - primary_key
name
Мне нужно получить ч/з отношение с помощью ленивой загрузки данные, вот как я делаю:
В модели users
public function params()
{
return $this->belongsTo(params::class,'params_status');
}
В контроллере
$listing = user::with('params')
Все отрабатывает, НО мне нужно получить одним запросом все параметры по всем полям params_status, params_sex и params_drinks
Можно сделать вот так:
В модели users
public function paramsStatus()
{
return $this->belongsTo(params::class,'params_status');
}
public function paramsSex()
{
return $this->belongsTo(params::class,'params_sex');
}
public function paramsDrinks()
{
return $this->belongsTo(params::class,'params_drinks');
}
И потом их вызывать в контроллере, но это увеличение запросов к БД, да и мне кажется не по феншую.
Гулешь не помог, ответа нигде не смог найти, вот пишу сюда.
Друзья, помогите мне инфу в голове по полочкам правильно уложить.
Я честно вам скажу, не могу понять чем лучше отношения от обычных запросов
Вот пример, есть у меня 3 таблицы:
payment_services
id
type_object_id
object_id
type_service_id
type_objects
id
name
translit
type_services
id
name
translit
где type_object_id - внешний ключ таблицы type_objects, type_service_id - внешний ключ таблицы type_service
Мне нужно получить коллекцию в которой будут поля
payment_services->object_id
type_objects->translit
с условием type_services.translit='hot'
Если делать простым запросом то вот
SELECT *
FROM payment_services
LEFT JOIN type_objects ON type_objects.id = payment_services.type_object_id
LEFT JOIN type_services ON type_services.id = payment_services.type_service_id
WHERE type_services.translit='hot'
На выходе я получу все необходимые мне данные с избытком.
Вот, что у меня получилось сделать с отношениями:
class paymentService extends Model
{
public static function ads()
{
typeService::where('translit', 'hot')->first()->actualAdsPayments();
}
}
class typeService extends Model
{
public function actualAdsPayments()
{
return typeService::hasManyThrough('App\paymentService','App\typeService','id')
}
}
Здесь я получу не все данные, в частности я не получу type_objects->translit, вот что у меня получается на выходе
#original: array:9 [▼
"id" => 3
"type_object_id" => 3
"object_id" => 1592148
"type_service_id" => 3
"period" => 7
"price" => "50.00"
"updated_at" => "2019-12-12 14:59:31"
"created_at" => "2019-12-11 22:20:42"
"laravel_through_key" => 3
]
поля: price, period, updated_at, created_at из таблицы payment_services, в начале их не стал описывать как не значащие.
По правилам ORM мне все нужно делать ч/з отношения, но я хоть убей не понимаю зачем? Если обычный запрос для меня куда понятней и проще, да и ч/з отношения я не получаю все необходимые мне поля.
Даже если если взять классику, "один автор и много книг", зачем мне отношения, если я все смогу сделать одним запросом с операторам LEFT JOIN
Только сразу к доке не отсылайте, читал ее на несколько раз, но так и не понял нужности отношений ((
Да, подключение к хостингу ч/з SSH
При подключении ч/з MySQL Workbench в поле SSH Hostname я указывал 11.22.33.44:1122 (ip и порт это для примера)
В поле MySQL Hostname я указал 127.0.0.1
В поле MySQL Server Port я указал 3336
Если конечно это поможет ответить на мой вопрос.
Мне нужно на локальной машине подключить удаленную БД к фреймворку Laravel
Проблема в том, что хостинг на котором находится БД подключен к нестандартному порту например 1122, а сама база находится на порту 3336
Вот так выглядит подключение к удаленной БД в файле database.php:
'mysql' => [
'driver' => 'mysql',
'host' => '11.22.33.44:1122',
'port' => '3336',
'database' => 'mybd',
'username' => 'root',
'password' => 'pass',
'unix_socket' => '',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
Если проверить подключение к этой БД по вышеуказанным настройкам, то выдаст вот такую ошибку: SQLSTATE[HY000] [2006] MySQL server has gone away
Вопросы:
1. Правильно ли я выполнил подключение к БД?
2. Данная ошибка связанна с долгим подключением к БД или фреймворк тупо не достучался до БД ?
Буду благодарен всем кто ответит по существу!
Хочу прикрутить у себя на сайте поисковую систему Sphinx и вот хочу спросить кто какие плагины использовал для Laravel 5
вот мне попался этот https://github.com/sngrl/sphinxsearch
Как вы считаете остановиться на нем или может есть более лучшие разработки?
Разобрался сам.
Проблема была в dump
Закоментил dump все стало работать
Делаю авторизацию с помощью ajax
public function login(Request $request){
$credentials = $request->only('email', 'password');
Auth::attempt($credentials,true);
dump(Auth::check());
return;
}
авторизация проходит, вот эта строчка
dump(Auth::check());
возвращает true
НО когда обновляю страницу F5 авторизованного пользователя нет.
Подскажите, почему не сохраняется авторизация после перезагрузки страницы.
Друзья, я разобрался. Сортировка мне нужна и на самом деле все очень просто
order by table.town=$town DESC, table.region=$region DESC, table.fed=$fed DESC `table`.`id` desc
Таблица содержит записи (объявления) относящиеся к разным городам, областям и федеральным округам
Сайт определил по Гео, что пользователь с такого то города, мне нужно:
1. Вывести сначала записи для этого города, далее области к которой относится данный город, далее к фед. округу к которой относится данный город, если нет для определенного города, то см. п.2
2. Если нет для определенного города, то ввести для региона к которому относится данный город, далее к фед. округу к которому относится данный город, если нет для региона, то см. п.3
3. Если нет для области, то выводим для фед. области к которому относится данный город, если нет то см. п.4
4. Выводим все объявления без привязки к Гео, с сортировкой по дате добавления.
Ну и еще в добавок все запросы отсортировать на убывание по дате добавления объявлений.
Сначала я думал что мне поможет сортировка по 3-ем полям, но нет, это не то.
Как вариант делать разные запросы и как то объединять их, но загвостка в том, что запрос типа ->paginate(), т.е. он формирует мне данные для пагинации, соответственно два или три разных запроса как я понимаю мне не подходят.
Буду сильно признателен за помощь.
запрос к БД
mymodel::select('id')->where('lit','=',$lit)->get();
где $lit - это строка из браузера, в ней может быть любая строка.
Гарантирует ли меня такой запрос от SQL инъекций? Или правильнее сказать, защитит ли меня Laravel от SQL инъекций?
З.Ы.
данным запросом я проверяю правильность составного url типа mysaite.ru/marka/model/page.html
В $lit может содержать /mark/ или /моdel/
нужно ли мне переменную $lit как то дополнительно обрабатывать или Laravel сам определит есть там инъекция или нет?
есть ЧПУ такого вида
http://localhost/reviews/ford
нужно взять второй параметр [ford] и передать в контроллер для соответствующей обработки.
я так понимаю это нужно делать в роутинге, вот у меня там такая строка:
Route::paginate('reviews/{mark?}', ['as' => 'reviews','uses' =>'ReviewsController@listReviews']);
Вопрос, каким образом мне там получить 2-ой параметр [ford] и передать в контроллер?
select towns.id, count(*) as total from towns left join offers on towns.id = offers.town_id group by towns.id order by total desc
Спасибо!
Есть таблица объявлений offer с привязкой к городам.
Нужно вывести кол-во объявлений (число) с привязкой к городам.
Собсно делаю так:
1. получаю список городов из таблицы town
2. запускаю цикл по offer
select count(*) as total from offer where town_id = id города
Получаю тысячу таких запросов для каждого города (печалька), подскажите пожалуйста как мне уменьшить кол-во запросов?