Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Друзья, помогите мне инфу в голове по полочкам правильно уложить.
Я честно вам скажу, не могу понять чем лучше отношения от обычных запросов
Вот пример, есть у меня 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
Только сразу к доке не отсылайте, читал ее на несколько раз, но так и не понял нужности отношений ((
Не в сети
Отношения у вас пишутся для того, чтобы вы в последствии могли просто и легко добавлять/удалять/обновлять записи в таблицах связанных через join . Посмотрите информацию например по методу sync.
И вообще при использовании ORM люди постепенно уходят от программирования SQL и переходят к ООП Php (Laravel).
С ув., Алексей
Не в сети
Я честно вам скажу, не могу понять чем лучше отношения от обычных запросов
А кто говорит, что они лучше? Это вещи как бы не взаимоисключающие.
Отношения Eloquent упрощают обращение к свойствам связанного объекта, не вдаваясь в детали реализации. Они бывают очень удобны, особенно если есть более одного уровня вложенности. Что касается дополнительных полей, то можно добыть их все. Я не понимаю ваш код, вижу только что вы не соблюдаете стандарты, поэтому вряд ли можете судить что работает, а что нет. Посмотрите в офф доки, там все отношения пишутся через $this->has* или $this-->belongs* . А у вас что?
Если цель построить эффективный запрос, то пишите на сыром SQL. Если цель написать код в стандартах Laravel, чтобы вашим преемникам будет удобно поддерживать его, используйте методы Eloquent по максимуму. Даже в ущерб супер-эффективности.
Не в сети
Страницы 1