Красноречивые отношения один-к-одному, в какой модели должна быть hasOne? - PullRequest
0 голосов
/ 23 мая 2018

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

Сомнение 1: Но между регистрацией и оплатой должна быть связь 1: 1.Я сомневаюсь, что hasOne должен быть в модели регистрации или в модели оплаты?Или это то же самое?А куда нужно добавить свой фк?В create_payments_table или "create_registrations_table", или в обоих?

Сомнение 2: Также доступны 2 способа оплаты: кредитная карта или ссылки.В случае использования ссылок необходимо хранить сгенерированные ссылки в таблице ссылок.Таким образом, между Платежом и Ссылкой также должны существовать отношения 1 к 1.Но у меня есть такое же сомнение, где должен быть hasOne?В Оплате или в Эталонной модели?А куда нужно добавить свой фк?В create_payments_table или "create_references_table", или в обоих?

Модели Doubt 1:

// Registration Model
class Registration extends Model
    public function payment()
        {
            return $this->hasOne('App\Payment');
        }
    }

// Payment model
class Payment extends Model
{
    public function registration()
    {
        return $this->belongsTo('App\Registration');
    }
}

Модели Doubt 2:

// Payment model
class Payment extends Model
{
    public function registration()
    {
        return $this->belongsTo('App\Registration');
    }

    public function reference()
    {
        return $this->hasOne('App\Reference');
    }
}
// Reference model
class Reference extends Model
{
    public function payment()
    {
        return $this->belongsTo('App\Payment');
    }
}

1 Ответ

0 голосов
/ 24 мая 2018

Laravel использует соглашение, которое, при понимании, может помочь прояснить вашу структуру:

имеет X отношения (hasOne, hasMany, hasManyThrough и т. Д.) Означаютвнешний ключ находится в отношении дочерний / внешний .

A User имеет один Phone.Таблица пользователя не знает телефона.Таблица Телефон имеет столбец user_id.

отношение отношение "* " означает, что таблица current имеет внешний ключ, ссылающийся на другую таблицу.

A Phone принадлежит User.

Ваш код модели «Сомнение 1» будет хорошо работать, и это то, что я бы предложил использовать.Вы бы поместили registration_id внешний ключ в вашу таблицу payments.Это гарантирует, что Платеж всегда ссылается на определенную Регистрацию (без лишних платежей, за которые вы не уверены, для чего), и поскольку у Регистрации может даже не быть платежа, у вас не останется пустое значение, которым вы не являетесь.конечно верно.

Что касается «Сомнения 2» и Референций, это зависит от того, ™ ️ если Ссылка всегда уникальна для Платежа, или если одна Ссылка может использоваться для нескольких платежей.

ЕслиКаждый платеж будет иметь уникальную ссылку, которая будет использоваться только один раз, после чего могут применяться те же отношения.payment_id внешний ключ будет добавлен к Справочной таблице / модели, Платеж имеет одну Ссылку, и Ссылка принадлежит Платежу.

Если Ссылка может быть применена к нескольким Платежам, тогда таблица payments будетнужен столбец reference_id.Оплата принадлежит Ссылке, и Ссылка имеет много Платежей.

Надеюсь, это поможет!Удачного программирования.:)

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