Laravel в основном прямолинеен, когда вы используете красноречие. Вы всегда можете настроить его.
Во-первых, почти все время я создаю модель и миграцию одновременно, используя это: php artisan make:model Something --migration
Я знаю, что вы уже делаете некоторые модели и/или миграции, но я буду шаг за шагом, чтобы помочь вам понять это.
Итак, в вашем случае это будут php artisan make:model User --migration
и php artisan make:model Inbox --migration
. Делая это, вы получаете две модели с именами User
и Inbox
и две миграции с именами date_create_users_table.php
и date_create_inboxs_table.php
. Возможно, вы уже создали пользовательскую таблицу по умолчанию с помощью php artisan make:auth
. Если это так, не переделывайте один.
Я не уверен в том, как laravel назовет миграцию модели Inbox... Так как, я думаю, в Laravel 5.3 плюриализация изменилась, и не всегда просто добавляйте «S» в конце.
Затем, когда у вас есть модели и миграции, давайте добавим строку в ваши файлы миграции. Так как вы хотите сделать отношения один ко многим. Пользовательскую трогать не нужно. Только миграция входящих. Каждая папка «Входящие» связана с одним пользователем, и у пользователей может быть много папок «Входящие». Добавьте что-то вроде этого в свою миграцию:
public function up()
{
Schema::create('inboxs', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id');
$table->foreign('user_id')->references('id')->on('users');
all other columns...
});
}
Там вы можете изменить имя столбца, если вам нужен отправитель, получатель и т. д. Вместо этого сделайте следующее:
public function up()
{
Schema::create('inboxs', function (Blueprint $table) {
$table->increments('id');
$table->integer('sender_id');
$table->foreign('sender_id')->references('id')->on('users');
$table->integer('recipient_id');
$table->foreign('recipient_id')->references('id')->on('users');
all other columns...
});
}
То, что мы только что сделали, это создание внешнего ключа, который Laravel будет использовать для построения запроса. Осталась последняя часть перед веселой. Нам нужно создать отношение в нашей модели. Начните с пользовательского:
Приложение/User.php
public function inboxs() {
return $this->hasMany(Inbox::class);
}
А теперь в модель App/Inbox.php:
public function user() {
return $this->belongsTo(User::class);
}
Если вам нужно иметь отправителя/получателя/и т. д., перейдите по этому пути:
public function sender() {
return $this->belongsTo(User::class);
}
public function recipient() {
return $this->belongsTo(User::class);
}
Обратите внимание, что каждая из ваших функций должна быть написана так же, как и в вашей миграции. sender_id
нужна связь с именем sender()
.
Теперь, когда наши отношения завершены, мы можем просто назвать все с помощью красноречия.
$inboxs = Inbox::with('sender')->get();
Это вернет массив всех ваших «Входящих» в таблицу «Входящие». Вы можете получить доступ к отправителю следующим образом: $inboxs[0]->sender();
Вам нужен идентификатор, сделайте это: $sender_id = $inboxs[0]->sender_id;
Имя отправителя: $sender_name = $inboxs[0]->sender->name;
Если вы хотите получить один почтовый ящик и у вас есть идентификатор, просто сделайте это $inbox = Inbox::with('sender')->find($id);
Таким образом, вы не получите массив, а только один результат и сможете получить доступ к отправителю напрямую, используя $sender_name = $inbox->sender->name;
вместо добавления [0] или используя цикл foreach.
Вы можете получить все сообщения, отправленные пользователем, используя что-то вроде этого:
$inboxs = Inbox::where('sender_id', $sender_id)->get();
Наконец, вы можете передать свои данные в представление, используя:
return view('path.to.view')->with('inbox',$inbox);
В представлении вы делаете это, чтобы показать имя отправителя:
//If view.blade.php
{{$inbox['sender']['name']}} //work a 100%
{{$inbox->sender->name}} //I'm not sure about this one
//If not using blade
<?php echo $inbox['sender']['name']; ?>
С помощью Eloquent можно многое сделать, и вы можете добавить столько условий, сколько захотите. Единственное, что я предлагаю вам сделать, если вы хотите использовать Eloquent, — помнить о проблеме n+1. Есть ссылка, где я это объясняю. Ищите раздел EDIT моего ответа.
Если вам нужна документация:
Отношения Laravel 5.3
Миграции Laravel 5.3
Laravel 5.3 Eloquent
person
Elie Morin
schedule
31.01.2017