Cách tham gia bàn ba bằng mô hình hùng biện laravel


83

Tôi có ba cái bàn

Bảng bài báo

 id
 title
 body
 categories_id
 user_id

Bảng danh mục

  id
  category_name

Bảng người dùng

 id
 user_name
 user_type

Tôi muốn hiển thị các bài báo với tên danh mục của chúng thay vì category_id và user_name thay vì user_id. Tôi cố gắng như truy vấn này Nó hoạt động!

$articles =DB::table('articles')
                ->join('categories', 'articles.id', '=', 'categories.id')
                ->join('users', 'users.id', '=', 'articles.user_id')
                ->select('articles.id','articles.title','articles.body','users.username', 'category.name')
                ->get();

Nhưng tôi muốn làm bằng cách Hùng biện. Làm ơn, làm thế nào tôi có thể làm gì?


1
Làm thế nào về việc tạo một dạng xem kết hợp các bảng đó, sau đó bạn tạo mô hình Eloquent chỉ đọc từ nó? Độ phức tạp của mã giảm xuống, bạn có lợi nhuận mà không cần phải làm việc chăm chỉ.
NB

1
Tất cả các mô hình và chức năng liên quan khác đều hoạt động cùng với Eloquent Model. Vì vậy, tôi cần sử dụng Eloquent Way.
Ngày

1
Bạn có nhầm ở đây ->join('categories', 'articles.id', '=', 'categories.id')không:? Thay vì articles.idnó nên được articles.categories_id. Hoặc là tôi sai?
FreeLightman

Câu trả lời:


137

Với Eloquent, rất dễ dàng để lấy dữ liệu quan hệ. Kiểm tra ví dụ sau với kịch bản của bạn trong Laravel 5.

Chúng tôi có ba mô hình:

1) Bài báo (thuộc về người dùng và danh mục)

2) Chuyên mục (có nhiều bài)

3) Người dùng (có nhiều bài viết)


1) Article.php

<?php

namespace App\Models;
 use Eloquent;

class Article extends Eloquent{

    protected $table = 'articles';

    public function user()
    {
        return $this->belongsTo('App\Models\User');
    }

    public function category()
    {
        return $this->belongsTo('App\Models\Category');
    }

}

2) Category.php

<?php

namespace App\Models;

use Eloquent;

class Category extends Eloquent
{
    protected $table = "categories";

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

}

3) User.php

<?php

namespace App\Models;
use Eloquent;

class User extends Eloquent
{
    protected $table = 'users';

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

}

Bạn cần hiểu mối quan hệ cơ sở dữ liệu của bạn và thiết lập trong các mô hình. Người dùng có nhiều bài báo. Chuyên mục có nhiều bài. Bài viết thuộc về người dùng và danh mục. Khi bạn thiết lập các mối quan hệ trong Laravel, bạn sẽ dễ dàng truy xuất thông tin liên quan.

Ví dụ: nếu bạn muốn truy xuất một bài báo bằng cách sử dụng người dùng và danh mục, bạn cần viết:

$article = \App\Models\Article::with(['user','category'])->first();

và bạn có thể sử dụng cái này như vậy:

//retrieve user name 
$article->user->user_name  

//retrieve category name 
$article->category->category_name

Trong trường hợp khác, bạn có thể cần truy xuất tất cả các bài báo trong một danh mục hoặc truy xuất tất cả các bài viết của một người dùng cụ thể. Bạn có thể viết nó như thế này:

$categories = \App\Models\Category::with('articles')->get();

$users = \App\Models\Category::with('users')->get();

Bạn có thể tìm hiểu thêm tại http://laravel.com/docs/5.0/eloquent


Cảm ơn bạn đã trả lời Nhưng tôi sử dụng laravel 4 và muốn trả về dữ liệu theo định dạng json. Giống như những điều này return Response::json( array( 'total_count' => $count, 'incomplete_results' => false, 'items'=> $articles->toArray() ));Tôi có thể làm gì với định dạng json?
Ngày

không thành vấn đề tất cả các công trình mã trong Laravel 4 chỉ là bạn cần phải loại bỏ không gian tên, và $ articles-> toArray () hoạt động tương tự, hãy thử
Anand Patel

Cảm ơn bạn anh em nó là công việc và bạn cứu cuộc sống của tôi :). Xin lỗi vì đã trả lời muộn Vì tôi không ở gần máy tính trong ngày hôm qua.
Ngày

4
Tôi không chắc chắn, nhưng có vẻ như cách này (sử dụng eloquent) tạo ra 3 truy vấn. Trong khi truy vấn với tùy chỉnh joinsẽ là duy nhất. Vì vậy, câu trả lời của @NayZawOo dưới đây dễ chấp nhận hơn.
FreeLightman

Điều gì sẽ xảy ra nếu tôi không muốn truy cập nó như $ article-> category-> category_name, nhưng sử dụng một số bí danh như $ article-> categoryName, làm cách nào để viết truy vấn hùng hồn trong trường hợp đó?
Herokiller

23

Thử:

$articles = DB::table('articles')
            ->select('articles.id as articles_id', ..... )
            ->join('categories', 'articles.categories_id', '=', 'categories.id')
            ->join('users', 'articles.user_id', '=', 'user.id')

            ->get();

Tôi muốn trả về định dạng đối tượng json. Vì tôi cần thử $ article-> count () và $ posts-> offset ($ offset); $ article-> get (array ('id', 'title', 'body')); Nhưng cách của bạn không thể áp dụng các hàm đối tượng đó. Cảm ơn sự hỗ trợ của bạn.
Ngày

1
return Phản hồi: json ($ posts);
Nay Zaw Oo

Mặc dù đây không phải là cách hùng hồn để làm điều đó, nhưng đó là cách duy nhất nếu bạn sắp xếp theo các trường trong bảng ngoại. (mà tôi không khuyến khích, nhưng đôi khi cần thiết). Vì lẽ đó, tôi nghĩ đây vẫn là một câu trả lời rất xác đáng. (là câu hỏi làm thế nào để tham gia bảng, cách hùng hồn thực sự không bao giờ gia nhập chúng trong truy vấn ban đầu.)
Skeets


“Mặc dù đây không phải là cách hùng hồn để làm điều đó, nhưng đó là cách duy nhất nếu bạn sắp xếp theo các trường trong bảng ngoại.” Skeets, Khi bạn nói cách duy nhất, bạn có đang nói rằng tài liệu laravel bỏ qua thông tin quan trọng này không?
Glen

3
$articles =DB::table('articles')
                ->join('categories','articles.id', '=', 'categories.id')
                ->join('user', 'articles.user_id', '=', 'user.id')
                ->select('articles.id','articles.title','articles.body','user.user_name', 'categories.category_name')
                ->get();
return view('myarticlesview',['articles'=>$articles]);

Trên Query có lỗi Liêm hạn chế vi phạm đã được giải quyết trong câu trả lời này
Akshay Kashyap
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.