Используйте значение столбца в другой таблице с помощью построителя запросов laravel

У меня есть две таблицы с именами пользователей и папки "Входящие".

В таблице «Входящие» у меня есть столбец с именем sender_id, в котором есть user_id отправителя.

Я хочу показать это сообщение в представлении. Мне нужен запрос, чтобы получить sender_id из таблицы входящих и использовать его для выбора определенного пользователя из таблицы пользователей. Мне нужно сделать это со всеми сообщениями и всеми пользователями.


person ari ari    schedule 31.01.2017    source источник


Ответы (2)


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

Я думаю, вы должны обновить свой код, например:

$user_messages = DB::table('messages')
                   ->select('messages.id as msgId','messages.message as message','users.id as userId','users.user_name as user_name')
                   ->join('messages','messages.user_id','=','users.id')
                   ->where('messages.user_id',$user_id)
                   ->get();

return view("view.path")
           ->with('messages',$user_messages);

Надеюсь, эта работа для вас!

person AddWeb Solution Pvt Ltd    schedule 31.01.2017