@usver12345

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

Мне нужно получить коллекцию в которой будут поля с условием type_services.translit='hot'
payment_services->object_id
type_objects->translit


Если делать простым запросом то вот
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
Только сразу к доке не отсылайте, читал ее на несколько раз, но так и не понял нужности отношений ((
  • Вопрос задан
  • 541 просмотр
Пригласить эксперта
Ответы на вопрос 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Либо ORM, либо SELECT.
ORM -сохраняет целостность данных при манипуляциях модификации БД.
При select - без разницы.
Ответ написан
@EvgeniiR
https://github.com/EvgeniiR
При выборах модификации данных не происходит, их можно спокойно делать через raw SQL.

Более того, это хорошая практика, и сущности не являются хранилищами данных по определению в принципе.

По правилам ORM мне все нужно делать ч/з отношения

Нету такого правила.
Просто на Ларавель часто проекты делаются тяп-ляп и в продакшн, и в сущности пихается все подряд.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы