为什么在Laravel中使用WHERE之后要循环获取数据?
为什么在Laravel中使用WHERE之后要循环获取数据?
下面是我的控制器代码:
$topics = Topic::where('board_id', $id)->with('user')->get(); $topic = Topic::find($id); $board = Boards::where('id', $id)->get(); return view('boards.show')->with('topics', $topics)->with('topic', $topic)->with('board', $board);
以下是生成URL的代码:
@foreach($board as $boards) 创建新帖子 没有找到帖子 @endforeach
但是如果我移除循环,就会出现错误:
在此集合实例上不存在属性[id]。
但是为什么我必须循环,如果只从boards表中获取一行数据?有没有不运行循环的解决办法?
在Laravel中,使用Boards::where('id', $id)->get();
来获取单行数据时,可以使用Boards::find($id);
或Boards::findOrFail($id);
代替。另外,使用return view('boards.show')->with('topics', $topics)->with('topic', $topic)->with('board', $board);
来传递视图中的普通值是不好的做法,可以改为
return view('boards.show',[ 'topics'=> $topics, 'topic'=> $topic, 'board'=> $board ]);
。此外,在Laravel中,改变href="{{ route('routeName',['id' => $user->id]))}}"
是最佳实践。
使用WHERE之后,循环获取数据的原因是因为使用了get()方法,从而获取到了一个集合。而实际上,由于只需要获取一个对象,所以不需要使用get()方法,而是可以使用find()方法来根据主键获取对象。在视图中,也不需要使用循环,只需要直接使用对象属性即可。
解决方法是使用find()方法来获取对象,而不是使用get()方法获取集合。同时,在视图中直接使用对象的属性即可,而不需要使用循环。
以下是代码示例:
$board = Boards::find($id);
Create New Post
另外,也可以使用first()或take(1)方法来获取第一个对象。
文章整理完毕。