laravel - Laravel 雄辩“用”的简单方法
问题描述
几个小时前我发布了一个相关问题,但我不明白为什么 Laravel eloquent 如此复杂......我再次阅读了很多关于这个主题的帖子,但没有人给我一个非常简单的请求的解决方案。
这是一个帖子仅属于一篇文章和一个用户的简单示例。所以关系在 Post 模型中定义如下:
public function article()
{
return $this->belongsTo(Article::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
我对 Laravel eloquent 很陌生......所以我只想根据上面模型中定义的关系显示所有帖子的列表,其中包含他们的 id、评论和相关的用户名和文章标题。我相信这很简单,我今天才学会了“with”。
所以在 PostController 中,我有:
$posts = Post::orderBy($sortField,$sortOrder)
->with(['article','user'])
->get();
这给了我一个包含所有帖子的集合。
第一个问题,我是否必须以使它们在下面的列表视图中易于访问的方式来操作 2 个相关字段?或者我可以通过将它放在查询中来避免控制器中的这种情况吗?
foreach ($posts as $post) {
$post->article = $post->article()->pluck('article');
$post->user = $post->user()->pluck('name');
}
在上面,字段 $post->article 列出了数组中的所有文章标题(文章字段)。
如果我在最后添加 [0],我会得到数组的第一个元素。
如果我使用 [post->article_id],我会得到错误的相关标题。
所以没有什么能按我想要的方式工作......为什么这么复杂???
最终,这是我需要在列表视图中做的事情。
@foreach ($posts as $post)
<p>{{ $post->id }} : {{ $post->comment }} by {{ $post->name }} from article {{ $post->article }}</p>
@endforeach
通过在查询生成器中进行查询,我立即得到我想要的......那么如何在 eloquent 中做同样的事情?
$users = DB::table('posts')
->join('articles', 'articles.id', '=', 'posts.user_id')
->join('users', 'users.id', '=', 'posts.user_id')
->select('users.*', 'articles.article', 'users.name')
->get();
解决方案
不清楚是什么让你误解它,所以这里有一个解释。
首先,您的帖子模型中有两个belongsTo
关系user
& article
。
当你运行这个
$posts = Post::orderBy($sortField,$sortOrder)
->with(['article','user'])
->get();
$post->article
您将获得一组帖子,并分别在属性&中包含文章和用户$post->user
。该 queryBuild 将启动 3 个查询,一个用于帖子,一个用于文章,一个用于最终用户。
现在,在您的刀片中,您想要访问article
Post 模型内部的 Article 模型中的属性,因此您可以这样做:
@foreach ($posts as $post)
.... from article {{ $post->article->article }}</p>
@endforeach
注意:当你打电话时,$post->article()
你会得到一个查询生成器,所以你在它后面加上一个
first()
=> 模型实例 / nullget()
=> 模型实例的集合或空集合pluck()
=> 属性的数组采摘value()
=> 第一个元素的值,就好像你使用了 pluck- ...(还有其他方法可以获得结果)
当您$post->article
不带括号调用时,它将运行:
first()
如果关系是belongsToget()
如果关系是 belongsToMany 或 HasMany 或....
或者
如果已经获取(集合或模型实例),它将为您提供属性。
因此,由于您with('article')
在第一个查询中使用(已获取),$post->article 将返回模型 Article 的实例,并且不会运行新查询。
推荐阅读
- python - 谷歌云中使用的 blob 名称是什么?
- reactjs - AWS S3 - 我们计算的请求签名与签名不匹配
- xml - XPath - 查找相似但包含非字母数字字符
- javascript - 反应原生:当我试图导航到某个页面时出现什么错误?
- python - TypeError: conv2d(): argument 'input' (position 1) must be Tensor, not int
- html - 如何强制 svg 动画在蒙版中重新触发
- javascript - 如何在javascript中使用不带switch case的模式匹配(以函数式编程方式)
- android - 如何在颤振中创建自定义范围选择器?
- python - 将 Python 搁置从 dbm.gnu 转换为 dbm.dumb
- sql - Teradata - 如何理解数据分布?