Как использовать Query Builder, чтобы создать отношение в массиве? Laravel - PullRequest
1 голос
/ 12 марта 2020

Я хотел бы установить связь с построителем запросов ... У меня есть три таблицы, и я хотел бы объединить таблицы для работы с функцией ... Я работаю в модели ... не в контроллере

Это моя функция

public function map($contactabilidad): array
{
    $relation = DB::table('tbl_lista_contactabilidad')
        ->join('tbl_equipo_postventaatcs', 'tbl_equipo_postventaatcs.id', '=', 'tbl_lista_contactabilidad.postventaatc_id')
        ->join('users', 'users.id', '=', 'tbl_equipo_postventaatcs.asesor_id')
        ->get();

    return [
        $contactabilidad->$relation->name,
        $contactabilidad->postventaatc_id,
        $contactabilidad->rif,
        $contactabilidad->razon_social,
        $contactabilidad->fecha_contacto,
        $contactabilidad->persona_contacto,
        $contactabilidad->correo_contacto,
        $contactabilidad->numero_contacto,
        $contactabilidad->celular_contacto,
        $contactabilidad->comentarios,
        $contactabilidad->contactado,
        $contactabilidad->respuesta->respuesta
    ];
}

1 Ответ

0 голосов
/ 12 марта 2020

Query \ Builder лучше всего рассматривать как основной инструмент, используемый Eloquent, но, тем не менее, это совершенно другой пакет. Цель Query \ Builder состоит в том, чтобы отделить SQL синтаксис от логики c, которая в него подается, тогда как цель Eloquent состоит в том, чтобы отделить этот лог c от структур таблиц и связей. Так что только Eloquent поддерживает классы Model и Relation, а Query \ Builder - нет. И то, что вы просите, имеет отношение к отношениям, так что, короче говоря, вы как бы лаете не на то дерево.

Кстати, я здесь дифференцирую 'Query \ Builder', потому что Eloquent также имеет собственную оболочку для этого класса под названием Eloquent\Builder, которая использует большую часть того же синтаксиса. К счастью или к несчастью, Eloquent пытается позволить разработчику взаимодействовать с ним знакомым образом; не нужно отслеживать новый набор имен методов, даже если вы без проблем выпали из Eloquent в объект Query \ Builder с помощью метода magi c __call. Это также делает нечто подобное в отношении Eloquent \ Collections vs. Support \ Collections. Но поначалу это может очень запутать, потому что вам просто нужно знать, с каким пакетом вы разговариваете.

Итак, чтобы ответить на ваш вопрос ...

Следует также отметить, что with() не просит Eloquent выполнить JOIN. Все, что он делает, - это запускает родительский запрос, извлекает значения ключей из результата, запускает дочерний запрос, используя их в операторе IN(), и впоследствии объединяет результаты. Вот что приводит к вложенным результатам. Исходя из опыта, это своего рода беспорядок, генерирующий настоящие операторы JOIN из Model Relations и сохраняющий псевдонимы таблиц уникальными, поэтому имеет смысл, что этот пакет просто пропускает попытки сделать это (за исключением сводных таблиц в отношениях «многие ко многим»). Это также имеет дополнительное преимущество: ваши связанные таблицы не обязательно должны находиться в одной базе данных. С другой стороны, Query \ Builder join(), как и у вас, будет представлять все поля для всех таблиц на верхнем уровне.

...