【问题标题】:Laravel 8: How to insert data into One To One relationshipLaravel 8:如何将数据插入一对一关系
【发布时间】:2021-05-29 18:14:03
【问题描述】:

我在 Laravel 8 中有一个项目,在这个项目中,moviesimdbs 表之间存在 一对一 关系。

所以我已将这些添加到模型中:

Movie.php:

public function imdb()
    {
        return $this->hasOne(Imdb::class);
    }

Imdb.php:

public function movie()
    {
        return $this->belongsTo(Movie::class);
    }

然后我创建了一个用于添加电影的表单。这是store 方法:

public function store(Request $request)
    {
        $new = new Movie();
        $new->name = $request->name;
        $new->link = $request->link;
        $new->year = $request->year;
        $new->actor = $request->actor;
        $new->director = $request->director;
        $new->imdb = $request->imdb;
        $new->starred = $request->starred;
        $new->watched = $request->watched;
        $new->save();
    }

如您所见,$new->imdb = $request->imdb; 用于插入 imdb 速率,但此数据应添加到 imdbs 表而不是 movies 表!

那么,我该怎么做呢?

这里也是imdbs表迁移:

public function up()
    {
        Schema::create('imdbs', function (Blueprint $table) {
            $table->id();
            $table->string('rate');
            $table->integer('movie_id')->unsigned();
            $table->timestamps();
        });
    }

更新 1

         @foreach($movies  as $movie)
            <tr>
                <th scope="row">{{ $movie->id }}</th>
                <td>{{ $movie->name }}</td>
                <td>{{ $movie->year }}</td>
                <td>@mdo</td>
                <td>Mark</td>
                <td>{{ $movie->imdb->rate }}</td>
                <td>@mdo</td
                <td><a href="">Edit</a> | <a href="">Delete</a></td>
            </tr>
            @endforeach

然后这给了我:

ErrorException试图获取非对象的属性“率”

$movies 就是来自这个方法:

public function index()
    {
        $movies = Movie::all();
        return view('admin.movies.index', compact(['movies']));
    }

【问题讨论】:

  • 您应该在 imdbs 表中添加一个新行,然后 $new-&gt;imdb 应该是 $new-&gt;imdb_id 吗?在电影上重命名列
  • @Ballard 你能解释更多作为答案吗
  • 我的错误我没有在 imdb 表上看到你的 movie_id
  • 你可以通过尝试我的回答来减少你的代码@KKKKKK
  • 谢谢你的回答,但是当我想得到这样的电影速率时:{{ $movie-&gt;imdb-&gt;rate }},我得到Trying to get property 'rate' of non-object 错误!

标签: php laravel laravel-8


【解决方案1】:

然后从电影表中删除列 imbd

 public function store(Request $request)
    { 
    $data = $request->only([
            'name','link','year','actor','director','starred','watched'
        ]);
     $movie=Movie::create($data);
     $imdb=$request->only(['imbd']);
     $imbd=$movie->imdb()->create($imbd);
}

【讨论】:

【解决方案2】:

在您的 Movie 模型商店中,只需使用您刚刚创建的模型的 movie_id 制作一个 IMDB 模型。

我建议也对您的请求数据进行一些验证,如下所示:

$data = $request->validate([
    //validation fields
]);

$movie = Movie::create($data);

否则,您的问题的解决方案是:

    public function store(Request $request)
    {
        $movie = new Movie();
        $movie->name = $request->name;
        $movie->link = $request->link;
        $movie->year = $request->year;
        $movie->actor = $request->actor;
        $movie->director = $request->director;
        $movie->starred = $request->starred;
        $movie->watched = $request->watched;
        $movie->save();

        if(!is_null($movie)) {
            $imdb = new Imdb();
            $imdb->rate = $request->imdb;
            $imdb->movie_id = $movie->id;
            $imdb->save();
        }
    }

【讨论】:

  • 我收到General error: 1364 Field 'imdb' doesn't have a default value
  • 因为您需要从 @KKKKKK 表中删除该列 - 请参阅我在创建电影模型时添加的字段。
  • 完成这项工作后,您应该切换到@JEJ 的答案
猜你喜欢
  • 2017-11-23
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 2021-11-24
  • 2021-08-29
  • 2018-06-25
相关资源
最近更新 更多