Объединить 3 таблицы на основе значений столбцов - Laravel - PullRequest
0 голосов
/ 31 января 2020

ТАБЛИЦА ВЕДУЩИХ

  • id
  • title
  • owner_id
  • from_table

ТАБЛИЦА РАБОТНИКОВ

  • id
  • first_name
  • last_name
  • роль

ADMIN TABLE

  • id
  • first_name
  • last_name
  • role
$users = Leads::query();

return Datatables::make($users)

    ->editColumn('owner_id', function ($user) {
        if($user->from_table == 'employee'){
            $emp = Employee::where('id',$user->owner_id)->first();
            return $emp->first_name.' '.$emp->last_name.' ('.$emp->role.')';
        }
        if($user->from_table == 'admin'){
            $admin = Admin::where('id',$user->owner_id)->first();
            return $admin->first_name.' '.$admin->last_name.' ('.$admin->role.')';
        }
    })

вышеприведенные решения работают нормально, но мы не можем найти отдельный поиск по столбцам в таблицах данных .

что мне нужно, так это запрос на присоединение, например:

if (приводит к ..from_table == сотруднику) // извлекаем данные из таблицы EMPLOYEE, т.е.

id title owner_id from_table first_name last_name роль

if (lead.from_table == admin) // извлекать данные из ADMIN TABLE, то есть LEADS TABLE + ADMIN TABLE

  • id
  • title
  • Идентификатор owner_id
  • from_table
  • first_name
  • фамилия
  • роль

Ответы [ 3 ]

0 голосов
/ 31 января 2020
Столбец

from_table должен содержать имя класса родительской модели.

Add in Leads model

    public function fetchOwner()
    {
        return $this->morphTo();
    }

Добавить в модель сотрудника

   public function employee()
    {
        return $this->morphOne('App\Employee', 'fetchOwner');
    }

Добавить в модель администратора

public function employee()
    {
        return $this->morphOne('App\Admin', 'fetchOwner');
    }

$users = Leads::with('fetchOwner');
return Datatables::make($users)

    ->editColumn('owner_id', function ($user) {
       return $user->fetchOwner->name;
    })

0 голосов
/ 03 февраля 2020

спасибо всем, кто пытался помочь ..

Я отвечаю на свой вопрос, поскольку нашел ответ через 9 дней, копаясь везде ..

так вот ответ:

you may want to replace owner_code by owner_id in your business table.

, поэтому я изменил from_table на owner_type, а owner_type теперь должен содержать имя класса в качестве значения ex: изменил admin на App \ Admin & employee на App \ Employee in Database

App\Admin.php

public function employee()
    {
        return $this->morphOne('App\Leads', 'owner');
    }


App\Employee.php

public function employee()
    {
        return $this->morphOne('App\Leads', 'owner');
    }

App\Leads.php

public function owner()
    {
        return $this->morphTo();
    }

Спасибо: laravel morph, как использовать пользовательские столбцы? (EddyTheDove) для указания точной проблемы ..

0 голосов
/ 31 января 2020

Я думаю, вам следует изменить структуру базы данных, чтобы использовать полиморфные c отношения, они полностью соответствуют вашим потребностям - https://laravel.com/docs/5.8/eloquent-relationships#polymorphic -отношения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...