Обновление Laravel имеет много отношений - PullRequest
0 голосов
/ 02 мая 2019

Я просто прочитал больше документации и проблем для решения этой проблемы, но у меня ничего не работает, у меня есть 2 таблицы с этими моделями:

class Month extends Model
{
    protected $guarded = ['id'];

    public function lessons()
    {
        return $this->hasMany(Lesson::class);
    }
}

class Lesson extends Model
{
    protected $guarded = ['id'];

    public function months()
    {
        return $this->belongsTo(Month::class);
    }
}

С этим примером кода я могу сохранить некоторые данные в отношении связи, и они отлично работают:

$month = Month::find(1);

$lesson = new Lesson();
$lesson->title = $request->title;
$lesson->content = $request->content;
$lesson->file_url = $uploadedFilePath;
$lesson->filename = $filename;
$lesson->time = $request->time;

$month = $month->lessons()->save($lesson);

сейчас я пытаюсь обновить некоторые поля урока с помощью этого кода:

$lesson = Lesson::find($id);

$lesson->update([
    'title'    => $request->title,
    'content'  => $request->content,
    'file_url' => $uploadedFilePath,
    'filename' => $filename,
    'time'     => $request->time
]);

$month = Month::find($request->months['0']);

$lesson = Lesson::find($lesson->id);
$lesson->months()->associate($month)->save();

тем, что я пытаюсь изменить столбец month_id в таблице Lesson в базе данных, например, со значением $month->id, как я могу это сделать?

ОБНОВЛЕНИЕ:

class Lesson extends Model
{
    protected $guarded = ['id'];

    public function month()
    {
        return $this->belongsTo(Month::class);
    }
}

Контроллер:

$lesson->update([
    'title' => $request->title,
    'content' => $request->content,
    'file_url' => $uploadedFilePath,
    'filename' => $filename,
    'time' => $request->time
]);

$month = Month::find($request->months['0']);
$lesson = Lesson::find($lesson->id);

$lesson->month()->associate($month)->save();
$lesson->update(['month_id' => $month->id]);

Миграция:

Schema::create('months', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->string('description');
    $table->string('price');
    $table->timestamps();
});

Schema::create('lessons', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('month_id')->unsigned();
    $table->string('title');
    $table->longText('content');
    $table->string('file_url');
    $table->string('filename');
    $table->string('time', 50);
    $table->foreign('month_id')->references('id')->on('months')->onDelete('cascade');
    $table->timestamps();
});

1 Ответ

0 голосов
/ 02 мая 2019

Во-первых, имя метода months() следует переименовать в month, потому что он возвращает один месяц, а не несколько месяцев.

Во-вторых, если у вашего Lesson есть поле с именем month_id, тогда это гораздо проще, чем вы думаете. Мы можем просто изменить эти две строки:

$lesson = Lesson::find($lesson->id);
$lesson->months()->associate($month)->save();

На следующую строку:

$lesson->update(['month_id' => $month->id);

Он должен обновить month_id вашего $lesson до $month->id

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...