Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Попробуйте как вариант "сырые" запросы, в которых можете использовать OUTER JOIN (LEFT / RIGHT JOIN). Вообще в SQL вы можете вкладывать запрос в запрос, т.е. извлечь что-то одно, а потом добавить с помощью INNER JOIN или OUTER JOIN, или вообще SELECT из другого SELECT (даже SELECT из одного и того же присвоив копии псевдоним с помощью AS).
в теории запросов SQL я хорошо понимаю и там простор для ума) но в данном случае уже все организовано через Builber так. поэтому встал вопрос как встроить эту выборку. спасибо Вам за отклик. мой вариант работает тоже
$query->where('title', '=', 'нужный') и $query->where('title', 'нужный'); - результат аналогичныйВопрос былили там есть какие угодно, кроме title='нужный''!=" - это и есть "кроме"
вопрос был
как выбрать те записи из 1 таблицы, у которых этой связи нет (т.е. совсем нет никаких связей в связующей таблице или там есть какие угодно, кроме title='нужный'). 2 условия
$this->builder->whereHas('2 таблица', function ($query) {
$query->where('title', '!=', 'нужный');
});
это было бы слишком просто) в Вашем примере выберутся только связанные записи, у которых нет ссылки на title='нужный', а не связанные записи не попадут в выборку вообще.
в общем вроде я нашла ответ.
$this->builder->whereDoesntHave('2 таблица', function($query) {
$query->where('title', '=', 'нужный');
});
но могу ошибаться)
был еще вариант сделать ->doesntHave и ->orWhereHas, но тогда следующие условия ->where уже плохо проходят при динамическом формировании моего запроса) получается что идет and ...or и выборка ломается.
Если кто понимает чуть больше в таких запросах, подскажите
Подскажите, всю голову сломала) есть 2 модели и связь многие ко многим (3 таблицы соответственно). знаю как выбрать из связанной таблицы запись определенную по типу
$this->builder->whereHas('2 таблица', function ($query) {
$query->where('title', 'нужный');
});
но не могу понять как выбрать те записи из 1 таблицы, у которых этой связи нет (т.е. совсем нет никаких связей в связующей таблице или там есть какие угодно, кроме title='нужный')
заранее спасибо
Спасибо Вам большое за советы!) буду экранировать при выводе значит
Если надо избежать инъекции тегов при выводе страницы, шаблонизатор это сделает за вас. По умолчанию теги экранируются
шаблонизатор это делает. но у меня REST API и тогда получается, мне придется на фронт стороне это делать ручными методами
То есть можно описать кастинг, но конкретно делать htmlspecialchars перед записью в базу это плохая практика. Это костыль. Когда вам понадобится получить непреобразованное значение, будете строит новый косталь на костыле.
а что вы тогда можете посоветовать, чтобы избежать сохранения нежелательных тегов?
Возможно. Делайте по этому же образцу.
так это я знаю, что можно прописать для каждого
public function setTitleAttribute($value)
{
$this->attributes['title'] = htmlspecialchars($value);
}
и в таком духе дальше)
у меня вопрос, нельзя ли это как-то объединить в одно? для всех полей или указать для каких именно? функционал то одинаковый
Добрый день! Кто может подсказать? в моделях есть читатели и преобразователи. возможно ли сделать так, чтобы преобразователь был не к 1 полю модели как например
public function setTextAttribute($value)
{
$this->attributes['text'] = htmlspecialchars($value);
}
только для поля text, а чтобы тоже самое выполнялось и еще для некоторых полей модели? (title, description и тд)
Товарищи, подскажите в чем суть или как сделать лучше? в таблицах mysql дата хранится как datetime. я вытаскиваю например всю коллекцию
$this->site->get();
и если у меня была нечаянно дата как 0000-00-00 00:00:00(перенеслась так из очень сатрой базы), то ларавел возвращает ее как
"created_at": "-0001-11-30 00:00:00"
у меня АПИ которое дальше кидает это все на фронт
почему так происходит и как этого можно избежать? пусть бы и оставляло нулевые все..
Явно или неявно вы будете использовать join, раз нужна связанная таблица.
а можно ли как-то его использовать с минимальными потерями?) при его использовании ведь явно указываются названия таблиц (а хотелось бы оперировать именно моделями), в фильтрации придется добавлять тоже имена таблицы, т к id и даты будут неопределенными...
Имеется 2 модели связанные 1 к 1 (hasOne) и соответственно работа через Eloquent ORM.
return $this->1модель->with('2модель')->get();
и вот такой вопрос. нужно отсортировать все это по полю из связанной таблицы. возможно ли это с таким подходом? join не хочу использовать по многим причинам. вся работа настроена с таким подходом и фильтрация и тд.
Коллеги, может кто знает как решить такой вопрос.
Хочу взять модели по отношению 1 к 1. возможны случаи, когда у модели не будет отношения и вторая модель придет null. могу ли я взять ее по умолчанию как экземпляр пустой модели?
Знаю что у версии 5,4 появился метод
->withDefault()
, но по документации он работает на отношение
->belongsTo
. А я хочу взять что-то типа
$this->hasOne('...', 'id')->withDefault();
но так не работает. может быть есть какие-то решения для такой задачи? спасибо
Подскажите, есть ли в Ларавел возможность получить связанные модели, даже если связи нет (одна из них null)?
Например есть таблица Users и Users_info и во второй таблице необязательно есть информация по конкретному пользователю. но они связаны 1 к 1. я хочу получить на выходе одним массивом json информацию из двух таблиц,даже если во второй нет записи, но чтобы она была в массиве с этими же полями, как будто запись есть) а не null. т е чтобы ответ был по структуре всегда одинаков.
public function get($id)
{
$response = [
'user' => $this->user_service->getUser($id)
];
return response()->json($response, 200);
}
public function getUser($id)
{
return $this->user->with('user_info')
->where('id', $id)
->get()
->first();
}
Ситуация такая. храню в таблице объектов несколько id разных значений, а в другой таблице их характеристики.
Пример. таблица Flat и поля санузел,балкон,тип дома и т.д. Они все имеют список своих значений,которые храню в другой таблице в виде id категория название краткое название.
Необходимо соответственно в выводимом списке объектов,вывести и их характеристики. не хочу выносить все значения в разные таблицы типа Балконы Санузлы и тд,потому что их несметное кол-во)
и вот мой вопрос. как правильно связать эти 2 таблицы,если по сути у Flat несколько внешних ключей получается в зависимости от того,какое значение я хочу взять. может есть какие-то практики с таким подходом или посоветуете как сделать лучше?
хочется обратиться что-то вроде flat->label->id->title и получить название нужно поля вне зависимости от того, хочу я получить балкон или тип дома, у всех значений свой id.
а такой вопрос. если у меня будет список юзеров таблицей,например и возле каждого стоит картинка удаления, то нужно будет у каждой картинки-кнопки делать форму и в ней помещать? это не плохая практика плодить формы?
Делаешь обычную форму, вместо инпута или кнопки ставишь ссылку, на ссылку вешаешь функцию. Здесь написано, как это делать - http://artkiev.com/blog/link-submit.htm
Большое спасибо!
Подскажите, пожалуйста, как можно навесить метод DELETE на resource контроллер на удаление не по кнопке в форме а по картинке?
К примеру есть есть такая конструкция на удаление пользователя.
<a class='btn' href='{{route('user.destroy',['user'=>$user->id])}}'>
<img src="{{ asset(config('settings.theme')) }}images/delete.jpg" style="cursor:pointer" alt="Удалить" title="Удалить">
</a>
но по ресту метод destroy требует наличия запроса
method_field('DELETE')
, как я вставляла для формы на удаления. как можно прикрутить его на картинку?
разобраться
спасибо, обязательно посмотрю!
напиши конкретно что хочешь сделать и составим точный запрос
хочу во-первых разобраться с хорошими практиками построения приложения сразу)и я уже поняла, что усложняю себе жизнь видимо)
Задача такая, что во-вторых хочу вынести реализации методов из контроллеров. и тут вопрос- выборки лучше тогда где делать, в моделях? или в каких-то других классах? в-третьих задача фильтров. т е на 1 метод будут приходить разные данные по фильтрации, поля в разных таблицах (потому и надо связать условия), фильтры должны накладываться, т.е. я могу выбрать например по логину(таблица user) и по паспортным данным юзера(которые в таблице userInformation).
и тогда у меня вопрос,если не использовать репозитории, то похожие методы-выборки и фильтры других разделов,связанные с другими моделями,тоже нужно реализовывать в их моделях? допустим тут я выбираю всех юзеров, а где-то выбираю все компании модели Company. это будет разная реализация похожи методов в их собственных моделях или где-то еще?))
как могла пояснила))сильно не ругайте!)
Вы имеете в виду, что нужно разделить все методы максимально, чтобы они не были привязаны друг к другу и собирать в зависимости от потребностей?по типу вынести отдельно where() и whereHas() и тд и собирать билдер как захочется?
практика это хорошо, но документация не дает таких знаний)) а хочется двигаться в правильную сторону
Плохой репозиторий...
что вы имеете в виду? не совсем Вас поняла(
я хочу чтобы методы были как можно более универсальны для любой модели и любых отношений с ней. и соотвественно и выборки.
есть join в конструкторах, есть WhereHas() я читала. но не могу привязать это все воедино. и как лучше использовать? join как-то избыточен получается если есть with с отношениями...
делаю отношение моделей через Eloquent ORM.
Допустим есть 2 модели юзеры и информация о них (2 разные таблицы)
делаю жадную загрузку по принципу
public function getUsers($where = null)
{
return $this->user_rep->with('companies', 'userInformation')->all($where);
}
и все работает прекрасно.
метод all() в репозитории
public function all($where = FALSE, $columns = array('*'))
{
$builder = $this->model;
if (is_array($where)) {
return $builder->where($where)->get($columns);
}
return $builder->get($columns);
}
выбирает соответственно модель user и все отношения с ней.
но вот возникла проблема. хочу сделать выборку по условию where. если это сама таблица юзер то все ок, но елси хочу выбрать из связанной таблицы то выдает конечно ошибку.
как правильно в таком построении сделать выборку из связанных моделей?
так просто?) спасибо Вам большое!