Модель Laravel без базы данных

#php #laravel-4 #eloquent

#php #laravel-4 #красноречивый

Вопрос:

У меня есть модельное блюдо, которое может содержать модельный ингредиент, а ингредиент обладает множеством свойств…

У меня есть все ингредиенты в DB, а также некоторые блюда….

Но я хочу создать новое блюдо, но без сохранения его в DB.

итак, что-то вроде:

 $meal = new Meal;
$meal->ingredients()->attach(5);
  

где 5 — идентификатор компонента в БД.

Однако это приведет к сбою, потому что $ meal еще не сохранен в БД и функция attach () пытается создать новую запись в таблице meal_ingredient….

Итак, есть ли какой-либо способ создать «автономную» модель и подключить ее к «онлайн» данным?

Спасибо

Комментарии:

1. Но если $meal отсутствует в БД — тогда какой вообще смысл «связывать» его? $ meal нигде не хранится …?

2. еда имеет belongsToMany (ингредиент), поэтому я бы предположил, что это то, на что она ссылается

3. Используйте Doctrine затем, Eloquent этого сделать нельзя, для этого необходимо сохранить обе модели перед их связыванием.

4. @DusanPlavak — но мой вопрос в том, «почему» вы пытаетесь связать их, если вы на самом деле не экономите $ meal? Что вы пытаетесь с этим сделать?

5. @DusanPlavak затем опишите, для чего вам это нужно. Вы можете «присоединить» ее к коллекции связанных компонентов, но это делает все это подверженным ошибкам.

Ответ №1:

Ваш вопрос:

Итак, есть ли какой-либо способ создать «автономную» модель и подключить ее к «онлайн» данным?


Наш подход:

  • Да, вы можете использовать своего рода модель Laravel без базы данных (автономно, как вы выражаетесь). Пожалуйста, обратитесь к jenssegers / laravel-model. По сути, это класс, реализующий ArrayAccess , ArrayableInterface JsonableInterface с некоторыми состояниями и поведением по мере необходимости.

  • Да, должен быть способ подключиться «Онлайн» IlluminateDatabaseEloquentModel к вашей «автономной» модели: POO и Design Pattern всегда готовы прийти на помощь. Пачкайте руки, не стесняйтесь копаться в исходном коде!

Мы предлагаем вам создать свою собственную «автономную» модель на основе исходного кода jenssegers/laravel-model и расширить «Онлайн» IlluminateDatabaseEloquentModel (шаблон декоратора или что-то еще!?) чтобы он знал о первом. Сантехника оставлена на ваше усмотрение, пока никакого кода с ложечки 😉


Примечания:

Вероятно, вам придется определить некоторые пользовательские зависимые (вспомогательные) классы, IlluminateDatabaseEloquentModel такие IlluminateDatabaseEloquentRelationsBelongsToMany как и так далее.

Кстати, вы также можете найти соответствующий пример расширения IlluminateDatabaseEloquentModel здесь jarektkaczyk / Eloquent-triple-pivot с использованием новейших возможностей PHP.

Удачного кодирования.

Комментарии:

1. Ответ Дейва имеет смысл, поскольку именно так создаются новые записи из формы ввода: вы создаете новый экземпляр и работаете с ним, пока не сохраните его в базе данных.

2. @dspitzle Я не согласен, поскольку то, что вы утверждаете, зависит от того, как вы обычно создаете объекты. Мы склонны создавать все атрибуты $fillable (пустой $guarded массив) и использовать Model::create([...$attributes]) для создания экземпляров модели. Мы почти не используем new Model() синтаксис.

3. Это решение все еще актуально для Laravel 8.x?

Ответ №2:

Вы должны относиться к объекту как к коллекции, чтобы работать «в автономном режиме». И не забудьте создать объекты, если они не существуют.

 $ingredient = new Ingredient;
$ingredient->id = 5;

$meal = new Meal;
$meal->ingredients->add($ingredient);
  

Таким образом, ни блюдо, ни ингредиент номер 5 не должны существовать в DB.

Ответ №3:

Иногда мы хотим использовать Eloquent , но без работы с реальной базой данных.

 class Currency extends Model
{
    use SushiSushi;

    protected $rows = [
        [
            'code' => 'usd',
            'title' => 'United states Dollar',
        ],
        [
            'code' => 'eur',
            'title' => 'Euro',
        ],
    ];
}
  

Для этого попробуйте:

https://github.com/calebporzio/sushi

Комментарии:

1. Это полезно для статических данных, таких как перечисления, но не помогает для динамических данных.