#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 или что-то еще), мы сможем вам помочь, но до тех пор это предсказание хрустального шара.