gpt4 book ai didi

php - 具有未大写 Laravel 关系的重复查询

转载 作者:搜寻专家 更新时间:2023-10-31 21:05:33 25 4
gpt4 key购买 nike

我在 Laravel 5 和一个简单的关系查询中遇到了一个奇怪的行为:我有一个 Issues MySQL 表和另一个 Articles 表。每个 Issue 都可以有一篇或多篇文章,因此这是一种普通的 OneToMany 关系。

Issue.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Issue extends Model
{
protected $fillable = ['status', 'volume', 'number', 'date'];

public function articles()
{
return $this->hasMany('App\Article');
}
}

Article.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
protected $fillable = ['status', 'authors', 'bibliography', 'references', 'notes', 'topic', 'issue_id'];
protected $with = ['Articles_contents'];

public function Articles_contents()
{
return $this->hasMany('App\Articles_content');
}

public function issue()
{
return $this->belongsTo('App\Issue');
}
}

(ArticlesArticles_contents 有另一种关系,但我认为这与我的问题没有关系)。

当我编辑一个问题时,我想列出其中的所有文章。 文章必须按数字字段排序到 Articles 表中,命名为“sort”:

public function edit($id)
{
$issue = Issue::with(array(
'Articles' => function ($query) {
$query->orderBy('sort', 'asc');
}
))->find($id);

$this->data['issue'] = $issue;

return view('admin_issues_edit', $this->data);
}

我的问题出在 View 中:当我这样做时,要列出文章:

        @foreach( $issue->Articles as $article )
<li id="article_{{ $article->id }}">{!! link_to_route('admin.articles.edit', $article->Articles_contents->first()->title, array($article->id)) !!}</li>
@endforeach

...我得到了正确的、最少的查询:

select * from issues where issues.id = '8' limit 1

select * from articles where articles.issue_id in ('8') order by sort asc

select * from articles_contents where articles_contents.article_id in ('20', '14', '5')

但是如果我用小写的 ->articles 做同样的事情,就像文档建议的那样:

        @foreach( $issue->articles as $article )
<li id="article_{{ $article->id }}">{!! link_to_route('admin.articles.edit', $article->Articles_contents->first()->title, array($article->id)) !!}</li>
@endforeach

我得到一个重复的查询,其中有一个 is not null 语句:

select * from issues where issues.id = '8' limit 1

select * from articles where articles.issue_id in ('8') order by sort asc

select * from articles_contents where articles_contents.article_id in ('20', '14', '5')

select * from articles where articles.issue_id = '8' and articles.issue_id is not null

select * from articles_contents where articles_contents.article_id in ('5', '14', '20')

当然,对 articles_contents 的两个查询是正常的,因为我在模型中进行了自动预加载,但我对 Articles 表有两个查询:第一个是我要求的正确排序,第二个是奇怪的 issue_id 不是空部分。

怎么了? :)

最佳答案

这是因为,什么时候这样做:

 @foreach( $issue->Articles as $article )
<li id="article_{{ $article->id }}">{!! link_to_route('admin.articles.edit', $article->Articles_contents->first()->title, array($article->id)) !!}</li>
@endforeach

你循环已经(刚加载的)可用的 Articles 因为你已经使用了:

array(
'Articles' => function ($query) {
$query->orderBy('sort', 'asc');
}
)

因此 Articles 存在,但是当您使用 articles 时,它会立即加载文章,因为关系中没有可用的 articles 键大批。所以这是在运行时执行的另一个查询,这是 Eloquent 关系的动态行为,是的 is not nullLaravel 使用,当它执行查询。

关于php - 具有未大写 Laravel 关系的重复查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33003835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com