Статья была переслана из профессионального сообщества разработчиков laravel. Оригинальная ссылка: https://learnku.com/laravel/t…
Определение ассоциаций моделей в laravel-это то, что каждый разработчик laravel, возможно, делал не один раз. Однако при попытке реализовать ассоциацию вы можете столкнуться с различными проблемами. Поскольку у laravel есть все виды связей, какую из них вам следует выбрать? Когда дело доходит до запроса моделей, как мы можем в полной мере использовать функцию ассоциации моделей?
Ассоциация моделей Laravel может сбивать с толку. Если вы не до конца понимаете, как работает ассоциация laravel на данный момент, не волнуйтесь. Прочитав эту статью, вы лучше поймете ее.
Чтобы ответить на этот вопрос, сначала вам нужно знать, какие варианты доступны. У Laravel есть три различных типа ассоциаций.
- Один на один
- Один ко многим
- Многие ко многим
Мы рассмотрим различные типы ассоциаций один за другим и объясним, когда их следует использовать.
Один на один
Связь “один к одному” является самой основной. Эта связь означает, что модель a может быть связана только с моделью B, и наоборот. Например, Пользователь Модель и Паспорт Модель становятся ассоциацией “один к одному”. У пользователя может быть только один проход. Аналогично, пропуск принадлежит только одному пользователю.
Давайте посмотрим, как определить эту связь в коде.
оставайтесь Пользователем В модели, мы создали паспорт
Метод. Мы передали hasOne
Метод, сообщающий laravel Пользователю У модели есть Паспорт .
Будьте осторожны: Все методы, используемые для определения ассоциаций, имеют дополнительные дополнительные параметры, в которых вы можете определить локальные и внешние ключи. По умолчанию laravel предполагает, что вы определяете passport_id
, потому что вы пытаетесь создать связь с моделью паспорта. Обратите на это внимание при создании файлов миграции!
оставайтесь Паспорт В модели, нам нужно определить обратные ассоциации. Мы должны сообщить Паспорту модели, что она принадлежит Пользователю Модели. Для этого мы можем использовать метод belongsTo
.
belongsTo(App\User::class); } }
Один ко многим
Следующая ассоциация, которую вы можете определить в laravel, – это один ко многим. Этот тип ассоциации означает, что модель типа a может быть связана с несколькими моделями типа B. Но модель типа В принадлежит только одной модели типа А.
Например, Пользователь Модель и Счет Взаимосвязь между моделями одна ко многим. У пользователей может быть несколько счетов, но счета принадлежат только одному пользователю.
В коде это записано следующим образом:
hasMany(App\Invoice::class); } }
Это похоже на код, который мы использовали для определения взаимно однозначных ассоциаций, верно?
Что нам нужно сделать сейчас, так это Счет-фактура Модель знает, что она принадлежит Пользователю Модели. Давайте определим обратную соответствующую ассоциацию одного ко многим ассоциациям.
belongsTo(App\User::class); } }
Многие ко многим
Последняя определяемая ассоциация-это ассоциация “многие ко многим”. Этот тип ассоциации означает, что модель типа a может быть связана с несколькими моделями типа B, и наоборот.
Например, Счет-фактура Модель и Продукт Связь между моделями будет много ко многим. Счет может содержать несколько продуктов, а продукты могут принадлежать нескольким счетам.
belongsToMany(App\Product::class); } }
Вы можете определить обратную связь этой связи следующим образом:
belongsToMany(App\Invoice::class); } }
Многие из многих ассоциаций несколько сложнее реализовать, поскольку для них требуются промежуточные таблицы в базе данных. Вы можете создать эту промежуточную таблицу в laravel, создав файл миграции.
Дистанционное общение один на один
имеет одну сквозную
ассоциацию, реализуемую единой промежуточной моделью ассоциации. Если у каждого поставщика есть пользователь и каждый пользователь связан с историей пользователей, поставщик может получить доступ к истории пользователя через пользователя.
Это таблица базы данных, необходимая для определения этой связи:
suppliers: - idproducts: - id - supplier_idproduct_history: - id - product_id
даже если таблица product_history
не содержит столбец supplier_id
, поставщик также может получить к ней доступ с помощью отношения “имеет один сквозной” product_history
Запись.
hasOneThrough(App\History::class, App\Product::class); } }
Перейдите в Пройдено
Первым параметром метода является имя модели, к которой вы хотите получить доступ. Второй параметр – это имя промежуточной модели.
Удаленный один ко многим
Ассоциация “hasmanythrough” эквивалентна ассоциации “прошел”, только для нескольких записей. Давайте воспользуемся предыдущим примером, но давайте изменим одну вещь: теперь у продукта может быть более одной записи в истории вместо одной. Таблицы базы данных остаются неизменными.
hasManyThrough(App\History::class, App\Product::class); } }
Это дает модели поставщика доступ к записям истории продукта.
Запрос ассоциации очень прост. Поскольку мы определяем связи “один к одному” для паспорта и “один ко многим” для счета-фактуры, мы можем использовать их в пользовательской модели. На каждом экземпляре пользовательской модели мы можем получить соответствующий паспорт и счет-фактуру.
passport->expiration_date; //Query invoice Association foreach($user->invoices as $invoice) { $invoice->total_amount; }
Вы также можете запросить обратную ассоциацию ассоциации. Если у вас есть счет, вы можете получить пользователей этого счета.
user->first_name;
Запрос многих ко многим ассоциациям работает точно так же, как и другие ассоциации. Кроме того, многие из многих ассоциаций имеют один атрибут pivot
. Это свойство представляет собой среднюю таблицу и может использоваться как любая другая модель.
Например, предположим, что связанная таблица имеет поле created_at
, мы можем использовать pivot для получения поля created_at
.
products as $product) { $product->pivot->created_at; }
запрос прошел
и имеет много сквозных
Работает точно так же, как и другие ассоциации.
Добавить ограничение
Вы можете добавить ограничения к отношениям во время запроса. Взгляните на следующий пример:
passport()->where('active', 1)->orderBy('expiration_date');
Проверьте, существует ли связь
Иногда вам нужно проверить, есть ли какие-либо ассоциации, добавленные в модель. Laravel
Есть способы проверить:
get(); //Find all users who don't have passports $users = App\User::doesntHave('passport')->get(); //Find invoices with 5 or more products $invoices = App\Invoice::has('products', '>=', 5)->get();
Я надеюсь, что эта статья поможет вам Laravel
Ассоциация моделей лучше понимает. Спасибо вам за чтение!