Столбец не найден: 1054 Неизвестный столбец 'taggables.tags_model_id' в 'списке полей' laravel eloquent - PullRequest
1 голос
/ 29 апреля 2020

Я собираюсь реализовать запрос, который извлекает все мои блоги с их тегами. Я использую отношения Laravel Eloquent polymorphi c, но у меня есть ошибка Column not found: 1054 Unknown column 'taggables.tags_model_id' in 'field list'. Все мои коды как в laravel, так и в SQL представлены ниже:

мои таблицы:


create table tags
(
    id         int auto_increment
        primary key,
    name       varchar(200)                        null,
    created_at timestamp default CURRENT_TIMESTAMP not null,
    updated_at timestamp                           null,
    deleted_at timestamp                           null
);


create table taggables
(
    id            int auto_increment
        primary key,
    tag_id        int                                 null,
    taggable_type varchar(512)                        null,
    taggable_id   int                                 null,
    created_at    timestamp default CURRENT_TIMESTAMP not null,
    updated_at    timestamp                           null,
    deleted_at    timestamp                           null,
    constraint fk23
        foreign key (tag_id) references tags (id)
            on update cascade on delete cascade
);

create index taggables_tag_id_index
    on taggables (tag_id);


create table blog
(
    id          int auto_increment
        primary key,
    title       varchar(200)                        null,
    passage     text                                null,
    author      varchar(200)                        null,
    category    varchar(200)                        null,
    img_url     varchar(200)                        null,
    created_at  timestamp default CURRENT_TIMESTAMP not null,
    updated_at  timestamp                           null,
    deleted_at  timestamp                           null,
    user_id     int                                 not null,
    category_id int                                 null,
    constraint fk18
        foreign key (user_id) references users (id)
            on update cascade on delete cascade,
    constraint fk19
        foreign key (category_id) references blog (id)
            on update cascade on delete cascade
);

create index blog_index
    on blog (category_id);

create index blog_users_index
    on blog (user_id);


Красноречивые модели


class BaseModel extends Model
{
    protected $table;
    protected $primaryKey;


    use SoftDeletes;

}

class BlogModel extends BaseModel
{

    protected $table = 'blog';
    protected $primaryKey = 'id';


    public function tags()
    {
        return $this->morphToMany(TagsModel::class,"taggable");

    }
}


class TagsModel extends BaseModel
{

    protected $table = 'tags';
    protected $primaryKey = 'id';

    public function blog()
    {
        return $this->morphedByMany(BlogModel::class,"taggable");
    }

}


, когда я позвонил этому запросить результат - пустой массив

 public function getItemsWithTags(array $attr)
    {
        return BlogModel::find(1)->tags;
    }

большое спасибо.

Ответы [ 3 ]

1 голос
/ 30 апреля 2020
Отношения

Laravel polymorphi c используют отражение по умолчанию для определения имени ваших ключевых столбцов. Поскольку ваша модель называется TagModel, Laravel предполагает, что внешний ключ будет tag_model_id.

    // Illuminate\Database\Eloquent\Model
    public function getForeignKey()
    {
        return Str::snake(class_basename($this)).'_'.$this->getKeyName();
    }

. Это можно исправить, явно передав верный внешний ключ методу morphedByMany:

public function tags()
{
    return $this->morphedByMany(TagsModel::class, 'taggable', null, 'tag_id');
}
0 голосов
/ 30 апреля 2020

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

BlogModel::with('tags')->find(1);
0 голосов
/ 29 апреля 2020

Вы не можете создать промежуточный родительский класс, такой как BaseModel. Поскольку он не будет работать в таблице Laravel со свойством $, попробуйте сделать следующее:

class BlogModel extends Model
{
    use SoftDeletes;

    protected $table = 'blog';

    protected $primaryKey = 'id';

    public function tags()
    {
        return $this->morphToMany(TagsModel::class,"taggable");
    }
}


class TagsModel extends Model
{
    use SoftDeletes;

    protected $table = 'tags';

    protected $primaryKey = 'id';

    public function blog()
    {
        return $this->morphedByMany(BlogModel::class,"taggable");
    }
}
...