with를 사용하여 각종 데이터를 얻는 방법

19723 단어 Laraveltech

개시하다


이번에 Laavel의 Eager Loading에서 사용with() 데이터 획득 방법을 요약하였습니다!with()에도 여러 가지 수법이 있는데 그 중에서 저는 실제 업무에서 실제 사용하는 방법을 설명하겠습니다.

with를 사용하는 이유


중첩된 테이블 데이터를 가져올 때 with를 사용하지 않고 데이터를 가져오면 Laavel은 데이터의 수량에 대한 조회만 발행합니다.
단, 사용with()을 통해 한 번의 조회를 통해 모든 데이터를 얻을 수 있다.
나는 블로그의 투고 사이트를 예로 삼아 실제 발행된 조회수를 비교하고 싶다.
Blog표와 Artical표가 있는데 각각 다음과 같다.
블로그 테이블
$table->id();
$table->string('title');
Articles 테이블
$table->id();
$table->tinyInteger('blog_id');
$table->string('title');
$table->text('body');
모델은 다음과 같습니다.
Blog.php
public function Articles()
{
return $this->hasMany(Article::class);
}
Article.php
public function Blog()
{
return $this->belongsTo(Blog::class, 'id', 'article_id');
}
여기서 블로그에 링크된article 데이터의 제목을 얻습니다.
with로 쓰지 않으면 아래처럼 쓸 수 있습니다.
DB::table('blogs')->join('article', 'blog.id', '=', 'article,blog_id')
                  ->select('article.title')
                  ->get();
발행 조회는 다음과 같다.
select `articles.title`, `article.title` from `articles` where `blogs.id` = '1'
select `articles.title`, `article.title` from `articles` where `blogs.id` = '2'
select `articles.title`, `article.title` from `articles` where `blogs.id` = '3'
위에서 말한 바와 같이 가져올 데이터 수량의 조회만 발표한다.
데이터가 3개가 적은 상태에서는 괜찮지만 많으면 처리 속도가 떨어지기 때문에 페이지를 여는 데 상당한 시간이 걸린다.
따라서 조회 수량with()을 줄일 수 있다.with()를 사용하여 동일한 데이터를 얻었을 때 다음과 같다.
DB:table('blogs')->with('articles')->get();
이때 발행된 조회는 다음과 같다.
select * from `articles` where `blogs`.`id` in ('1', '2', '3')
방금 데이터 수량의 조회수만 발행하여 한 번의 조회를 통해 데이터를 얻을 수 있습니다.
그나저나 with('articles')의article은 아까의 Blog입니다.php에서 지정한 함수입니다.
이렇게 하면 with()를 사용하면 발행된 조회 수를 줄일 수 있기 때문에 끼워 넣은 데이터를 사용할 때with를 사용하는 것을 권장한다.
이번에는 with()의 각종 데이터 획득 방법에 대해 설명하고 싶습니다.

with를 사용하여 각종 데이터를 얻는 방법


그럼 바로 몇 개 소개하고 싶어요!

가져올 데이터 선택


대상 데이터를 선택한 후 데이터를 가져오려면
DB:table('blogs')->with('articles:blogs_id,title')->get();
위에서 말한 바와 같이 지정: 이후에 얻으려는 데이터는 데이터를 선택한 후에 얻을 수 있다.
또한 이때 외부 키blogs_id가 필요하지 않아도 외부 키에 주의해야 한다.
동시에 블로그.php의 관계를 통해 여러 개의 데이터를 얻으려면 한 번에 쓸 수도 있습니다.
예를 들어, 블로그입니다.php에는 articles() 이외에 다음과 같은 기록이 있습니다.
public function hoge()
{
return $this->hasMany(Hoge::class);
}
article표의 타이틀과 hoge표의 타이틀에서 데이터를 얻으려면 다음과 같다.
DB:table('blogs')->with('articles:blogs_id,title', 'hoge:blogs_id,hoge')->get();

중첩된 데이터 가져오기


여기에 새로운comments표를 추가합니다. 각각 아래와 같습니다.
comments 테이블
$table->id();
$table->tinyInteger('article_id');
$table->text('comment');
Article.php
public function Comments()
{
return $this->hasMany(Comment::class);
}
Comment.php
public function Article()
{
return $this->belongsTo(Article::class, 'id', 'article_id');
}
comments표를 얻으려면 . 연결을 통해 데이터를 얻을 수 있습니다.
DB:table('blogs')->with('articles.comments')->get();
는 블로그 모델Articles()과 아티컬 모델Comments()에 각각 썼다.
또한 :를 사용하면 (select)comments표의 데이터를 선택한 후에 데이터를 얻을 수 있습니다.
DB:table('blogs')->with('articles.comments:article_id,hoge')->get();

관계 목표의 데이터 수를 계산하다


블로그에 쓴 글 수를 확인하고 싶을 때withCount()를 이용하면 글 수를 간단하게 표시할 수 있다.
$blogs = DB::table('blogs')->withCount('articles')->get();
가져온 글 수를 표시할 때
$blogs->articles_count;
와 같이 関数名_count만 쓰면 건수를 표시할 수 있다.
또한 이때 표시할 데이터를 선택한 후 건수를 표시할 수도 있다.
가령articles표에 투고 날짜created_at가 기록되어 있다고 가정하자.
어제부터 오늘까지 쓴 글만 얻으려면 다음과 같이 쓰세요.
$today = Carbon::now();
$yesterday = Carbon::yesterday();

$blogs = DB::table('blogs')->withCount(['articles' => function($q) use ($today, $yesterday) {
            $q->whereBetween('created_at', [$yesterday, $today]);
        }
        ]);
latest()를 사용하면 데이터도 새로운 순서로 다시 배열할 수 있다.
$blogs->articles_count->latest();

최후


이번에 with()를 사용하여 데이터를 얻는 방법을 총결하였습니다!
공식 수첩을 읽고 다른 방법도 많이 있으니 편리하게 사용하기 위해서라고 생각합니다.
끝까지 읽어주셔서 감사합니다!

좋은 웹페이지 즐겨찾기