Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 13.12.2019 05:07:12

Laravel отношения или обычные запросы с LEFT JOIN?

Друзья, помогите мне инфу в голове по полочкам правильно уложить.
Я честно вам скажу, не могу понять чем лучше отношения от обычных запросов
Вот пример, есть у меня 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
Только сразу к доке не отсылайте, читал ее на несколько раз, но так и не понял нужности отношений ((

Не в сети

#2 18.12.2019 10:51:54

Alexsaab
Откуда: Москва
Сообщений: 92

Re: Laravel отношения или обычные запросы с LEFT JOIN?

Отношения у вас пишутся для того, чтобы вы в последствии могли просто и легко добавлять/удалять/обновлять записи в таблицах связанных через join . Посмотрите информацию например по методу sync.

И вообще при использовании ORM люди постепенно уходят от программирования SQL и переходят к ООП Php (Laravel).

С ув., Алексей

Не в сети

#3 19.12.2019 14:59:47

Re: Laravel отношения или обычные запросы с LEFT JOIN?

Я честно вам скажу, не могу понять чем лучше отношения от обычных запросов

А кто говорит, что они лучше? smile Это вещи как бы не взаимоисключающие.

Отношения Eloquent упрощают обращение к свойствам связанного объекта, не вдаваясь в детали реализации. Они бывают очень удобны, особенно если есть более одного уровня вложенности. Что касается дополнительных полей, то можно добыть их все. Я не понимаю ваш код, вижу только что вы не соблюдаете стандарты, поэтому вряд ли можете судить что работает, а что нет. Посмотрите в офф доки, там все отношения пишутся через $this->has* или $this-->belongs* . А у вас что?

Если цель построить эффективный запрос, то пишите на сыром SQL. Если цель написать код в стандартах Laravel, чтобы вашим преемникам будет удобно поддерживать его, используйте методы Eloquent по максимуму. Даже в ущерб супер-эффективности.

Не в сети

Подвал раздела