#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',
],
];
}
Для этого попробуйте:
Комментарии:
1. Это полезно для статических данных, таких как перечисления, но не помогает для динамических данных.