Laravel Красноречивые отношения между одной моделью и многими моделями как MorphOne? - PullRequest
0 голосов
/ 11 июня 2018

Введение:

У меня есть эти таблицы с их моделями:

  • таблица адресов -> Модель адреса
  • таблица пользователей --> Модель пользователя
  • таблица компаний -> Модель компании
  • таблица свойств -> Модель свойства

Правила:

  • каждый пользователь может иметь только один адрес.
  • каждая компания может иметь только один адрес.
  • каждое свойство может иметь только один адрес.

Здесь можно выполнить два возможных планирования отношений:

  • Пользователь hasOne Адрес иАдрес принадлежит к Пользователь [то есть отношение один к одному], но недостатком является то, что внешний ключ находится в таблице адресов, то есть поле user_id и повторяетсято же самое отношение с другими моделями [Company and Property], мы получим еще два внешних ключа в таблице адресов, которые являются [ company_id and property_id ], тогда мы получим 3 внешних ключа для 3 моделей, но будет заполнен только один из каждой строки запись, оставляя всегда два поля внешних ключейоставлено пустым

    Я чувствую, что это накладные расходы на таблицу адресов.

ИЛИ наоборот:

  • Адрес hasOne Пользователь и пользователь принадлежит к Адрес [отношение один к одному также].Это имеет то преимущество, что здесь хранится внешний ключ в связанной модели, т.е. [пользователь, компания и свойство], поэтому нет пустых полей внешних ключей - но все же это противоречит реальной логике моделирования, которая диктует, что Пользователь hasOne Адрес более чем Адрес hasOne Пользователь.

Мой вопрос:

Существуют ли какие-либо другие отношения, которые могут связать эти 4 Модели в одно отношение, подобное Полиморфным Отношениям, но без использования MorphMany , но вместо этого используя MorphOne что довольно странно, я не могу найти его в документации по Laravel, хотя сам метод существует в Eloquent Relations.

Возможно ли это MorphOne полиморфное отношение и как оносоставлен?

Существующий код:

//Address model
public function user(){
    return $this->hasOne(User::class);
}
public function company(){
    return $this->hasOne(Company::class);
}
public function property(){
    return $this->hasOne(Property::class);
}

//User model
public function address(){
    return $this->belongsTo(Address::class);
}

//Company model
public function address(){
    return $this->belongsTo(Address::class);
}
//Property model
public function address(){
    return $this->belongsTo(Address::class);
}

1 Ответ

0 голосов
/ 11 июня 2018

Вот связь MorphOne между адресом с одной стороны и пользователем , компанией и Свойство на другой стороне:

class Address extends Model
    public function addressable(){
        return $this->morphTo();
    }       
}

class User extends Model
    public function address(){
        return $this->morphOne(Address::class,'addressable'); //note this is not MorphMany()
    }       
}

class Company extends Model
    public function address(){
        return $this->morphOne(Address::class,'addressable');
    }       
}

class Property extends Model
    public function address(){
        return $this->morphOne(Address::class,'addressable');
    }       
}

затем в UserController что-то вроде этого:

$user = User::find(1);

$addressData = [
    'street_name' => '5, Golf street',
    'country_id' => 100, //etc..
];

//to add new address record related to user:
$user->address()->create($addressData);
dd($user->address);

//to update existing address record related to user:
$user->address->update($addressData);
//dd($user->address);
...