Красноречивый - несколько принадлежит?

Кажется, я не могу найти прямого ответа на вопрос, могут ли модели Eloquent иметь несколько отношений принадлежности.

Только с точки зрения нормализованных отношений с БД это совершенно верно. Возьмем гипотетический пример страницы CMS, которая принадлежит одному и только одному автору, а также принадлежит одной и только одной категории. Автор и категория не связаны друг с другом и не связаны друг с другом. В БД мы просто ожидаем, что страница будет иметь поля author_id и category_id, каждое из которых имеет внешний ключ к другой таблице.

Кажется, было бы правильно сделать:

class Page extends Model
{
    public function author()
    {
        return $this->belongsTo(Author::class);
    }

    public function category()
    {
        return $this->belongsTo(Category::class);
    }
}

Сценарий кажется действительным ... ЗА ИСКЛЮЧЕНИЕМ того, что это, кажется, нарушает соглашение и автоматическую магию методов associate и dissociate, которые ожидают, что будет только одно отношение «принадлежит».

Так правильно ли использовать несколько отношений belongsTo в одной и той же модели? А если нет, то как бы вы вместо этого описали такой распространенный сценарий? (Я должен сразу же отметить, что это не тот же сценарий, что и полиморфные отношения, где одна модель принадлежит другой, которая может быть того или иного типа.)

вы имеете в виду отношения «принадлежит многим»?

lagbox 28.11.2022 03:09

Нет, containsToMany используется для определения отношений «многие ко многим», для чего требуется таблица связывания. Это вопрос о ДВУХ разных отношениях один ко многим.

Chris Nanninga 28.11.2022 03:14

как насчет этих ДВУХ разных отношений? что насчет них? ... также, что вы имеете в виду, "что предполагает наличие только одного отношения "принадлежит"? ... у вас может быть столько отношений "принадлежит", сколько у вас есть внешних ключей в таблице, ограничений нет

lagbox 28.11.2022 03:15

«у вас может быть столько отношений ownTo, сколько у вас есть внешних ключей в таблице, ограничений нет». Что ж, это отвечает на мой основной вопрос, если вы МОЖЕТЕ это сделать. Однако как насчет метода associate? Вы знакомы с ним? laravel.com/docs/9.x/… Что делать associate, когда существует несколько отношений принадлежности?

Chris Nanninga 28.11.2022 03:31
associate и dissociate вызываются отношениями, а не самой моделью
lagbox 28.11.2022 03:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
5
184
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Eloquent Model может иметь несколько одинаковых отношений. Это означает, что вы можете иметь belongsToMany() столько, сколько вам нужно, вы можете иметь belongsTo(), hasOne(), hasMany() и т. д. Это не повлияет на другие отношения, поскольку у них другое имя метода. что является основной идентификацией для отношений.

Сценарий кажется действительным ... ЗА ИСКЛЮЧЕНИЕМ того, что это, кажется, нарушает соглашение и автоматические методы ассоциирования и диссоциации, которые ожидают, что будет только одно отношение «принадлежит».

Если вы понимаете документацию Обновление отношения BelongsTo, вы будете использовать associate() или dissociate() после метода отношения. В документации нет "except there to be only a single belongs to relationship"..

$page->author()->dissociate(); // it will set the "author_id" on the page as null and will not affect the `category()` at all.

$page->category()->associate($category); // it will add a the "category_id" of the given category to the page and will not affect the `author()` at all.

Д'о. Я читал документацию, так как метод вызывается непосредственно в модели. Тогда много шума из ничего! Спасибо!

Chris Nanninga 28.11.2022 04:39

Другие вопросы по теме