Laravel отношения один на один и запрос - PullRequest
0 голосов
/ 18 октября 2018

У меня есть клиенты, которые были классифицированы как (физические лица - компании), я хочу получить всю информацию о клиентах из основной таблицы и подтаблицы в одном запросе, я пробовал много раз и не нашел решения для этого .. Мойпопытки в конце этой темы

Мои таблицы:

customer_type

  • id
  • type

клиенты

  • id
  • address
  • customer_type_id

customer_individual

  • id
  • first_name
  • last_name
  • customer_id

customer_company

  • id
  • company_name
  • logo
  • customer_id

My RelationShips:

CustomerType.php

class CustomerType extends Model
{
    public function customers()
    {
        return $this->hasMany('App\Customer');
    }
}

Customer.php

class Customer extends Model
{
    public function customer_type()
    {
        return $this->belongsTo('App\CustomerType');
    }

    public function more()
    {
        $related = ($this->customer_type_id == '1') ? 
        'App\CustomerIndividual' : 'App\CustomerCompany'; 
             // 1 => individual

        return $this->hasOne($related, 'customer_id');
    }
}

CustomerIndividual.php

class CustomerIndividual extends Model
{
    public function customer()
    {
        return $this->belongsTo('App\Customer');
    }
}

CustomerCompany.php

class CustomerCompany extends Model
{
    public function customer()
    {
        return $this->belongsTo('App\Customer');
    }
}

Я хочу вывод следующим образом:

[
  {
     "id": 1,
     "customer_type_id": 1,
     "address": "New York",
     "more": {
        "id": 1,
        "customer_id": 1,
        "first_name": "John",
        "last_name": "doe"
     }
  },
  {
     "id": 2,
     "customer_type_id": 2,
     "address": "london",
     "more": {
        "id": 2,
        "customer_id": 2,
        "name": "ANA IT Company",
        "logo": "analogo.png"
     }
  }
]


Это мои попытки:

return Customer::with(['person', 'company'])->get();

$customers = Customer::query();

$customers->when($customers->customer_type_id === 1, function($q){
   return $q->with('person');
});

$customers->when($customers->customer_type_id === 2, function($q){
   return $q->with('company');
});

$c = $customers->get();
return $c;

Я надеюсь найти решение здесь.

1 Ответ

0 голосов
/ 18 октября 2018

Что вы можете сделать, это создать новую коллекцию и добавить ее к ней.

Предполагая, что $q->with('person') является объектом:

$collection = new \Illuminate\Database\Eloquent\Collection;

$customers->when($customers->customer_type_id === 1, function($q){
    $collection->push($q->with('person'));
});

$customers->when($customers->customer_type_id === 2, function($q){
    $collection->push($q->with('company')); 
});

$c = $collection->flatten();
return $c;

Документы: Здесь

...