Ларавель: Кажется ли в каждой таблице модель?

Я создаю систему событий с Laravel. У меня есть несколько таблиц:

  • случаи
  • occasion_categories (автомобили, трики и другие)

Теперь у меня есть модель под названием Occasion, которая представляет собой таблицу, она также имеет внешний ключ в таблице event_categories.

Я хочу получить все категории событий, но

  • Мне нужно сделать отдельную модель под названием OccasionCategory для event_categories и определить все отношения в этих моделях,

  • или я могу просто сделать метод в классе Occasion, например getCategories(), а затем использовать класс DB, например DB::table('occasion_categories')->get(), для извлечения всех возможных категорий?

Ответ 1

Обновлено 4 октября 2019 года:

Короче говоря, NO, вы можете использовать Query Builder вместо Eloquent ORM, но если вы хотите использовать Eloquent ORM, то каждая таблица должна быть связана с model. Кроме того, модель не обязательно должна быть Eloquent model, вы можете создать модель без расширения красноречивой модели, которая может использовать или не использовать базу данных. Модель не означает слой доступа к базе данных, но... в любом случае, это еще одна важная тема.

Оригинальный ответ:

На самом деле вам нужно создать две модели Eloquent для обеих ваших таблиц, если вы используете Eloquent, например:

class Occasion extend Eloquent {
    // Laravel will look for occasions table for Occasion model so following line
    // is optional if you don't want to use another table name for Occation model
    protected $table = 'occasions';

    // Now declare the relationship with "occasion_categories" table
    public function occasionCategory()
    {
        // Make sure you have used occasion_categories_id as the foreugn key
        return $this->belongsTo('OccasionCategory', 'occasion_categories_id', 'id');
    }
}

Теперь создайте модель OccasionCategory:

class OccasionCategory extend Eloquent {

    protected $table = 'occasion_categories';

    // Now declare the relationship with "occasion_categories" table
    public function occasions()
    {
        // Make sure you have used occasion_categories_id as the foreign key
        return $this->hasMany('Occasion', 'occasion_categories_id', 'id');
    }
}

Теперь вы можете извлекать случаи, используя родительские случаи, используя что-то вроде этого:

// Use the Occasion model
$allOccasionsWithCategory = Occasion::with('occasionCategory')->get();

// Find one Occasion whose id is 1 with OccasionCategory
$oneOccasionsWithCategory = Occasion::with('occasionCategory')->find(1);

// You may use this to get the related occasionCategory model
$occasionCategory = $oneOccasionsWithCategory->occasionCategory;

// Use the OccasionCategory model
$allOccasionsWithCategory = OccasionCategory::with('occasions')->get();

// Find one OccasionCategory whose id is 1 with Occasion
$oneOccasionsWithCategory = OccasionCategory::with('occasions')->find(1);

// You may use this to get all the related occasions model
$occasions = $oneOccasionsWithCategory->occasions;

Подробнее о отношениях на веб-сайте Laravel.

Если вы используете Query Builder напрямую, вы можете использовать что-то вроде этого (без модели):

// All occations
$occations = DB::table('occations')->get();

// All occasions and related occasion_categories
$occationsAndCategories = DB::table('occations')
                            ->join('occasion_categories', 'occasions.occasion_category_id', '=', 'occasion_categories.id')
                            ->get();

Узнайте больше о Query Builder на веб-сайте Laravel.

Ответ 2

В laravelish способе создания базы данных используется Query Builder или Eloquent: Laravel - это основа, и всегда имеет смысл использовать ресурсы, которые она предоставляет.


Laravel: нужна ли каждой таблице модель?

Короткий ответ:

  • Нет, это не так, пока вы не используете Eloquent.

Длинный ответ:

  • Query Builder - это способ пойти, если вы все еще хотите придерживаться laravel.

  • Вы также можете использовать простой старый PDO: Помните, что Laravel на самом деле является фреймворком PHP!


Мой прием:

Всегда полезно быть последовательным:

  • Сделайте это Eloquent (определение моделей + отношений), несмотря на то, что вы можете смешать Eloquent и некоторые Query Builder, как вы предполагали.

  • Выполнение этого с использованием Query Builder исключительно равномерно и возможно.

Мои личные предпочтения относятся к опции Eloquent.


Решение:

WereWolf - ответ Alpha предоставляет превосходные возможные решения, используя обе опции.

Ответ 3

Просто хотел, чтобы здесь перезвонили с обновлением.

В этом конкретном случае, я не уверен, что все изменилось с момента публикации (может быть неправильно, всегда больше, чтобы обнаружить), но в случае отношений "многие ко многим", отношения "один к одному" между таблицей и модель повреждена благодаря методу pivot().

Из одного из моих собственных проектов:

public function fees()
{
    return $this->belongsToMany(Service::class)->withPivot("description");
}

Таким образом, у вас может быть две модели ("Плата" и "Услуга"), но вы можете получить доступ к данным в промежуточной таблице, не нуждаясь в модели "ServiceFee".

В клинке:

{{ $service->pivot->description }}

На первый взгляд, это может показаться тривиальным, но при этом получается достаточно много-много-многозначных отношений, и таблицы чисел могут даже превзойти количество моделей. (Является ли этот гипотетический сценарий обязательно хорошо продуманным, у меня, к сожалению, не хватает времени, чтобы задуматься.)

Ответ 4

Хотя я не уверен, я уверен, что это сработает. Или, DB::raw('select * from occasion_categories') должен работать.

Я не знаю, какие здесь лучшие методы, но если вы просто спрашиваете, возможно ли это тогда, да. Один из этих двух методов должен работать нормально.