Несколько таблиц для одного красноречивого отношения - PullRequest
1 голос
/ 26 апреля 2020

У меня есть одно сообщение Модель, и администратор и пользователь могут создать сообщение. Но для Администратора и Пользователя есть отдельная модель, называемая Администратор и Пользователь .

Модель сообщения имеет столбец с именем create_by, в котором хранится идентификатор создателя. Теперь вопрос в том, как мне установить отношения с Посланием и создателем. Мне нужно получить сведения о создателях из модели «Администратор» или из модели «Пользователь».

В настоящее время я использую метод внутри Сообщение модели, как показано ниже.

public function creator(){
    if(User::find($this->created_by)){
      return User::find($this->created_by);
    }else{
      return Admin::find($this->created_by);
    }
}

Но он не поддерживает функцию Eager Загрузка в Laravel.

Спасибо за вашу помощь.

Ответы [ 2 ]

3 голосов
/ 26 апреля 2020

В этом случае вы должны использовать полиморфные c отношения. Как указано в laravel do c

Отношение polymorphi c позволяет целевой модели принадлежать более чем одному типу модели с использованием одной ассоциации.

Таким образом вы можете получать сообщения от моделей Admin и Пользователь .

Определите следующий метод в Сообщение модель.

use Illuminate\Database\Eloquent\Model;

class Message extends Model

{
    /**
     * Get the owning messageable model.
     */
    public function messageable()
    {
        return $this->morphTo();
    }
}

И добавьте следующие столбцы в файл миграции:

$table->unsignedBigInteger('messageable_id');
$table->string('messageable_type');

Затем определите следующий метод в Admin модель.

class Admin extends Model
{
    /**
     * Get all of the admin's messages.
     */
    public function messages()
    {
        return $this->morphMany('App\Message', 'messageable');
    }
}

А в Пользователь модель.

class User extends Model
{
    /**
     * Get all of the user's messages.
     */
    public function messages()
    {
        return $this->morphMany('App\Message', 'messageable');
    }
}
0 голосов
/ 26 апреля 2020

Laravel имеет Accessor, они отлично подходят для такого рода вещей. В вашей модели добавьте метод, такой как ниже. это возьмет созданный по id и найдет администратора или пользователя, а затем вернет эти результаты. Так что теперь, когда вы делаете запрос на сообщение, вы просто получаете доступ к пользователю, например, $ message-> creation_by-> username; Вы можете узнать больше о мутаторах здесь https://laravel.com/docs/7.x/eloquent-mutators#defining -an-accessor

 public function getCreatedByAttribute($value)
 {
    $user = User::where('id', $value)->first();
    if(!is_null($user)){
        return $user;
    }

    $admin = Admin::where('id', $value)->first();
    if(!is_null($admin)){
        return $admin;
    }

   return null;

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