Laravel 6.x манипулировать данными отношений как атрибутом - PullRequest
0 голосов
/ 08 марта 2020

Можно ли в laravel создать собственные атрибуты со связями?

Например: у Клиента есть связь с CustomerAddress. Теперь я хочу получить всех клиентов с отношениями, а затем иметь атрибут address на клиенте. Поле address будет создано с несколькими столбцами таблицы customer_address.

Таблица customer_address содержит столбцы street, state, и они должны подключаться к address на клиенте модель.

$customer = \App\Customer::with("customerAddress")->get();
return $customer->address;
>> street.state

было бы возможно, чтобы toArray () и JSON () не игнорировали эти пользовательские атрибуты?

1 Ответ

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

Убедитесь, что в ваших моделях установлены правильные отношения, затем определите метод, который возвращает настраиваемый атрибут, а затем добавьте его в массив $appends

Customer

class Customer extends Model
{
    protected $appends = ['custom_attribute'];

    public function addresses()
    {
        return $this->hasMany(CustomerAddress::class, 'customer_id');
    }

    public function getCustomAttribute() {
        return 'some calculated data';
    }
}

CustomerAddress

class CustomerAddress extends Model
{
    protected $appends = ['custom_attribute'];

    public function customer()
    {
        return $this->belongsTo(Customer::class, 'customer_id');
    }

    public function getCustomAttribute() {
        return 'some calculated data';
    }
}

Обратите внимание, что имя атрибута - sneak_case, а имя метода в StudlyCase с префиксом get (что в конечном итоге делает его camelCase). Имя метода и имя доступа должны совпадать.

Теперь в вашем контроллере вы можете получить всех клиентов и их адреса.

$customers = Customer::with("addresses:street,state")->get();

Если вы войдете в $customers, вы увидите всех клиентов и их адреса. Теперь вы можете использовать пользовательский атрибут для возврата пользовательских значений.

Пример:

public function getCustomAttribute() {
      return "{$this->street} {$this->state}";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...