Как добавить данные в другие таблицы при создании записи?

#php #mysql #laravel #forms #eloquent

Вопрос:

Есть таблица post, к ней с помощью hasMany прикреплены еще 4 таблицы, в которых почти те же поля, а именно таблицы(магазин, адрес, номер, купить).Все данные должны быть заполнены при написании сообщения PostController@store

 function storee(Request $request)
{
$this->validate($request,[
'name' => 'required'
]);
$post = Post = Post::query()->create([
'name' => $request->get('name'),
'decr' => $request->get('decr'),
]);
}
 

Модельный Пост

 public function getStoreForPost() 
{
 return $this->hasMany(Store::class);
}
 

просмотреть сообщение о создании

 @extends('index')
 
@section('content')
<form method="post" action="{{ route('post.store') }}">
    @csrf
    <div align="center">
        <div style="padding-bottom: 25px;">
            <label for="name">Post name</label>
            <input type="text" name="name" id="name">
        </div>
        <div style="padding-bottom: 25px;">
            <label for="description">Post Description</label>
            <input type="text" name="decr" id="description">
        </div>
    </div>
 
    <div class="store" align="center" style="padding-bottom: 10px;">
        <button class="store_add" type="button">Add Store</button>
        <br>
        <br>
        <div>
            <label for="getStoreForPost">Store</label>
                <input type="text" id="store_name" name="store_name[]">
                <input type="text" id="store_link" name="store_link[]">
        </div>
    </div>
    <div align="center">
    <button type="submit">Add Post</button>
    </div>
</form>
@endsection
 
@push('script')
$(document).ready(function () {
        $(".store_add").on('click',function(){
            $(".store").append(
              `<div style="padding: 10px 0">
                <label for="getStoreForPost">Store</label>
                    <input type="text" id="store_name" name="store_name[]">
                    <input type="text" id="store_link" name="store_link[]">
              </div>`
            );
        });
        
    });
@endpush
 

Когда я пытаюсь добавить сообщение, я получаю ошибку 1364, не могу заполнить поле, которое не имеет нулевых свойств. Это понятно, что я не уточнил, что заполнять.Поэтому я решил добавить в контроллер новые трюки.

 $post->getStoreForHouse()->create([
'name' => $request->get('store_name'),
'url' => $request->get('store_url')
]);
 

Миграции
после миграции

 $table->string('name');
$table->text('decr')->nullable();
 

перемещение хранилища

 $table->string('store_name');
$table->text('store_link');
$table->unsignedBigInteger('post_id')->nullable();
$table->foregin('post_id)->references('id')->on('posts');
 

Модельный магазин

 use AppModelsPost;

use HasFactory;

protected $table = 'store';

protected $fillable = ['store_name', 'store_url'];
protected $hidden = ['created_at', 'updated_at'];

public function post()
{
return $this->belongsTo(Post::class);
}
 

Но ничего не изменилось, как бы я ни пытался вылезти из оишбка 1364 или ошибка в запросе ::создать-инструкции для этого действия нет
UPD:
Если я заполняю поля через pma, то все данные выводятся и работают так, как должны, то есть я вручную заполняю таблицу записей для теста (название записи, описание записи), затем захожу в таблицу хранилища , и там добавляю название магазина и URL-адрес магазина, а также прикрепляю его к определенной записи в таблице записей. Оказывается, когда я захожу на страницу с просмотром этого поста, я вижу все строки, которые я прикрепил к нему в pma.

Пожалуйста, помогите мне, я уже забил себе этим голову.

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

1. Если у вас есть 4 таблицы с одинаковыми заголовками, вам, вероятно, следует просто объединить их в одну таблицу со столбцом, указывающим тип записи.

2. Можете ли вы показать точное сообщение об ошибке? обычно это говорит вам, чего именно вам не хватает при заполнении?

3. @GrumpyCrouton, Это почти те же поля, что и у меня, не все из них. И там мне нужны таблицы только для сбора данных. Но на данный момент меня интересует только то, как добавлять данные в другие таблицы в той же форме при создании поста.

4. @mrhn, BadMethodCallException Method IlluminateDatabaseEloquentCollection::create does not exist.

5. Ваш код не должен вызывать это исключение, пожалуйста, обновите включенный код

Ответ №1:

Итак, каждое из этих отношений нужно рассматривать отдельно, поскольку, как вы упомянули в своих ответах, они должны быть разными таблицами.

 $post = Post::query()->create([
'name' => $request->get('name'),
'decr' => $request->get('decr'),
]);
 

это должно работать просто отлично, если вам нужно, чтобы другие значения были обнуляемыми или по умолчанию имели значение, вам нужно установить это с помощью миграции в базе данных.

В дальнейшем,

 BadMethodCallException Method IlluminateDatabaseEloquentCollection::create does not exist.
 

означает, что вы выбрали коллекцию (возможно, через связь), а затем вызвали функцию, так что что-то вроде:

 $post->addresses->create(['whatever'=>'data']);
 

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