Laravel Многие модели как издатель полиморфных отношений с опорой? - PullRequest
0 голосов
/ 21 марта 2019

Привет, у меня проблемы с отношением и дизайном базы данных.

Существует три таблицы, которые называются «статьи», «пользователи» и «компании» с одним атрибутом, каждый из которых называется id:

"articles" -id

"users" -id

"companies" -id

В таблице статей содержится много издателей, которые являются пользовательской моделью или моделью компании.

Моя сводная таблица должна быть похожа на «авторы» -id, -model_id, -model_name, -article_id

Есть ли способ получить идентификаторы и данные издателя статьи из моделей в одной коллекции одним запросом? Может быть, я неправильно понял проблему, и для этого случая есть более простое решение.

спасибо заранее

Ответы [ 3 ]

1 голос
/ 22 марта 2019

Предполагается, что в Article есть только одна компания или один пользователь. Правильный способ сделать это - создать одно-многим (полиморфное) отношение, создав таблицу со следующими столбцами: {article_id, articleable_id, articleable_type} а затем определить его в вашей модели

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    /**
     * Get all of the owning articleable models.
     */
    public function articleable()
    {
        return $this->morphTo();
    }
}

и таблица Users: -

class Userextends Model
{
    /**
     * Get all of the user's articles.
     */
    public function articles()
    {
        return $this->morphMany('App\Article', 'articleable');
    }
}

и то же в модели компании: -

class Company extends Model
{
    /**
     * Get all of the companies articles.
     */
    public function articles()
    {
        return $this->morphMany('App\Article', 'articleable');
    }
}

и затем вы можете получить связь, используя: -

$user = App\User::find(1);

foreach ($user->articles as $article) {
    // do this
}

как уже упоминалось здесь

но если статья может иметь больше, чем пользователь или компания, то вам придется сделать много-много полиморфных, как упомянуто здесь

0 голосов
/ 22 марта 2019

Я реализую эту модель

class Article extends Model
{

    public function authors()
    {
        return $this->hasMany('App\Article_Authors','article_id');
    }
}

class Article_Authors extends Model
{

     public function authorable()
    {
        return $this->morphTo();
    }

    public function article(){
    return $this->belongsTo('App\Article');
    }
}


class User extends Model
{

    public function authors()
    {
        return $this->morphMany('App\Article', 'authorable');
    }
}


class Company extends Model
{

    public function authors()
    {
        return $this->morphMany('App\Article', 'authorable');
    }
}

и после вызова $ article-> авторы я получаю

0   
id  1
record_id   2
authorable_id   1
authorable_type "App\\User"
created_at  "2019-03-22 15:56:38"
updated_at  "2019-03-22 15:56:38"
1   
id  2
record_id   2
authorable_id   1
authorable_type "App\\Company"
created_at  "2019-03-22 15:56:59"
updated_at  "2019-03-22 15:56:59"

как называть эту модель сейчас: (

@ MohamedGabr

Редактировать: После проведения исследования я не нашел никакой возможности получить результат в одном запросе, есть только возможность сделать цикл и проверить моменты модели. Это создает циклы лута для сбора. Мне нужен результат кеша, и пожалуйста, согласитесь на это временно.

Спасибо за помощь

0 голосов
/ 22 марта 2019

@ Мохамед Габр проблема в том, что мне это нужно во многих отношениях.

и у меня нет проблем с получением статьи от модели или компании пользователя.

Мне нужно получить авторов из статьи.

Полагаю, что-то подобное будет.

class Article extends Model
{

    public function authors()
    {
        return $this->hasMany('App\Article_Authors','article_id');
    }
}

class Article_Authors extends Model
{

     public function authorable()
    {
        return $this->morphTo();
    }

    public function article(){
    return $this->belongsTo('App\Article');
    }
}


class User extends Model
{

    public function authors()
    {
        return $this->morphMany('App\Article', 'authorable');
    }
}


class Company extends Model
{

    public function authors()
    {
        return $this->morphMany('App\Article', 'authorable');
    }
}

я могу заставить это работать, но я не думаю, что это хорошая практика

...