У меня беда во многих ко многим прошивкам. Мой код в контроллере правильный. После того, как я добавляю два данных, которые успешно завершаются, третий раз, когда я пытаюсь вставить, выдает ошибку:
Call to a member function bagcollects() on null
и ошибка в этом коде
$collection->bagcollects()->attach($bagcollect->id);
Я просто не понимаю, почему возникла эта ошибка!
Я покажу весь код метода хранилища CollectionsController:
public function addbag(Request $request){
$collection = Collection::find($request->input('collection_id'));
$bagcollect = Bagcollect::create([
'bag_id' => $request->input('bag_id'),
'weight' => $request->input('weight')
]);
$collection->bagcollects()->attach($bagcollect->id);
return redirect()->route('collections.show', ['collection'=> $collection->id]);
}
Миграция по коллекциям
Schema::disableForeignKeyConstraints();
if (!Schema::hasTable('collections')){
Schema::create('collections', function (Blueprint $table) {
$table->engine = "InnoDB";
$table->increments('id');
$table->integer('assignment_id')->unsigned();
$table->foreign('assignment_id')->references('id')->on('assignments')->onUpdate('cascade')->onDelete('cascade');
$table->timestamp('collected_on');
});
}
Миграция на bagcollects
Schema::create('bagcollects', function (Blueprint $table) {
$table->engine = "InnoDB";
$table->increments('id');
$table->integer('bag_id')->unsigned();
$table->double('weight', 8, 2);
$table->foreign('bag_id')->references('id')->on('bags');
$table->timestamps();
});
Миграционный пакетcollect_collection
Schema::create('bagcollect_collection', function (Blueprint $table) {
$table->engine = "InnoDB";
$table->increments('id');
$table->integer('bagcollect_id')->unsigned();
$table->integer('collection_id')->unsigned();
$table->foreign('bagcollect_id')->references('id')->on('bagcollects');
$table->foreign('collection_id')->references('id')->on('collections');
$table->timestamps();
});
коллекции show.blade.php добавить модальный
<!-- ADD MODAL -->
<div class = "modal fade" role = "dialog" id = "addModal">
<div class = "modal-dialog">
<div class = "modal-content">
<div class = "modal-header">
<button type = "button" class = "close" data-dismiss = "modal">×</button>
<h4 class = "modal-title">New Collection</h4>
</div>
<div class = "modal-body">
<div class = "row">
<div class = "col-md-12">
<form class = "form-horizontal" method = "POST" action = "{{ route('collections.addbag') }}">
{{ csrf_field() }}
<div class = "row form-group">
<input class = "form-control" name = "collection_id" id = "collection_id" value = "{{$collection->id}}" type = "hidden">
<div class = "{{ $errors->has('bag') ? ' has-error' : '' }}">
<div class = "col-md-8">
<label for = "bag_id">Bag</label>
<select class = "form-control" required id = "bag" name = "bag_id">
<option value = "" data-hidden = "true"
selected = "selected">
</option>
@foreach($bags as $bag)
<option value= "{{ $bag->id }}">
{{ $bag->name }}
</option>
@endforeach
</select>
</div>
</div>
<div class = "{{ $errors->has('weight') ? ' has-error' : '' }}">
<div class = "col-md-8">
<label for = "weight">Weight</label>
<input type = "text" class = "form-control" id = "weight" name= "weight" required>
</div>
</div>
</div>
<!-- SUBMIT BUTTON -->
<button type = "submit" class = "btn btn-success btn-fill pull-right" id = "form-button-add">
Create
</button>
<button data-dismiss = "modal" aria-hidden = "true" class = "btn btn-basic pull-right" style = "margin-right: 2%">
Cancel
</button>
<div class = "clearfix"></div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
Модель collection.php
protected $fillable = [
'id',
'assignment_id',
'bag_id'
];
public $timestamps = false;
public function assignment()
{
return $this->belongsTo('App\Assignment');
}
public function bagcollects()
{
return $this->belongsToMany('App\Bagcollect');
}
Bagcollect.php
protected $fillable = [
'bag_id',
'weight'
];
public function collections()
{
return $this->belongsToMany('App\Collection');
}
public function bag()
{
return $this->belongsTo('App\Bag');
}
BagcollectCollection.php
protected $table = "bagcollect_collection";
protected $fillable = [
'bagcollect_id',
'collection_id',
];
Collection уже является классом в Laravel; у вас могут возникнуть проблемы с вашей моделью Collection по сравнению с помощником Collection (laravel.com/docs/5.6/collections). Рассмотрите возможность изменения названия вашей таблицы / модели.
@TimLewis, которую она, вероятно, использует со своим собственным пространством имен, не должно быть проблемой ..
@ HasanTıngır Да, наверное, но, не видя заявления use, трудно сказать. Изменил мою формулировку комментария, теперь он больше похож на предупреждение.
вы можете сбросить переменную $collection с помощью метода dd ()?
Я делаю dd ($ collection). В моем 1-м добавлении идентификатор коллекции все еще существует, но во 2-м добавлении он показывает нулевой идентификатор коллекции, который я передаю. Я добавлю его вид
@MariaTheresaChavez Можете поделиться своей моделью?
Хорошо, я выложу свою модель через некоторое время
@ChristianGallarmin Модель я уже выкладываю. Проверить это






Call to a member function ... on
null
Означает, что вы пытаетесь вызвать функцию объекта null. Просмотрите свой код:
$collection = Collection::find($request->input('collection_id'));
С вашей текущей логикой $collection может быть null, поэтому вызов
$collection->bagcollects() ...
Выдает эту ошибку.
Выполните отладку результата Collection::find(...) и убедитесь, что $collection не является null.
Я пытаюсь использовать dd в своем коде контроллера. Когда я ввожу данные, collection_id передается из show.blade.php, но при второй попытке collection_id стал нулевым. Я не знаю, потому что думаю, что его следует передать, зная, что он находится в шоу, и collection_id существует в этом представлении
вы можете поделиться моделью отношений?