लार्वा लूप मॉडल द्वारा तीन तालिका में कैसे शामिल हों


85

मेरे पास तीन टेबल हैं

लेख तालिका

 id
 title
 body
 categories_id
 user_id

श्रेणियाँ तालिका

  id
  category_name

उपयोगकर्ता तालिका

 id
 user_name
 user_type

मैं user_id के बजाय category_id और user_name के बजाय उनके श्रेणी नाम के साथ लेख दिखाना चाहता हूं। मैं इन क्वेरी की तरह कोशिश करता हूं यह काम है!

$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();

लेकिन मैं एलोकेंट तरीके से करना चाहता हूं। कृपया, मैं कैसे कर सकता था?


1
उन तालिकाओं में शामिल होने वाले दृश्य बनाने के बारे में कैसे, तो आप एलोक्वेंट मॉडल बनाते हैं जो बस इसे पढ़ता है? कोड जटिलता कम हो गई है, आप लाभ कमा रहे हैं, कोई भी कठिन कार्य शामिल नहीं है।
एनबी

1
अन्य सभी संबंधित मॉडल और फ़ंक्शन एलोकेंट मॉडल के साथ मिलकर काम करते हैं। इसलिए मुझे एलोक्वेंट वे का उपयोग करने की आवश्यकता है।
नाय

1
क्या आप यहाँ गलत हैं ->join('categories', 'articles.id', '=', 'categories.id'):? इसके बजाय articles.idयह होना चाहिए articles.categories_id। या मैं गलत हूँ?
15

जवाबों:


140

संबंधपरक डेटा को पुनः प्राप्त करने के लिए Eloquent के साथ इसका बहुत आसान है। Laravel 5 में अपने परिदृश्य के साथ निम्नलिखित उदाहरण देखें।

हमारे पास तीन मॉडल हैं:

1) अनुच्छेद (उपयोगकर्ता और श्रेणी के अंतर्गत आता है)

2) श्रेणी (कई लेख हैं)

3) उपयोगकर्ता (कई लेख हैं)


1) अनुच्छेद। एफपी

<?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) श्रेणी। एफपी

<?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');
    }

}

आपको अपने डेटाबेस संबंध और मॉडल में सेटअप को समझने की आवश्यकता है। उपयोगकर्ता के कई लेख हैं। श्रेणी में कई लेख हैं। लेख उपयोगकर्ता और श्रेणी के हैं। एक बार जब आप लारवेल में रिश्तों को स्थापित करते हैं, तो संबंधित जानकारी को पुनः प्राप्त करना आसान हो जाता है।

उदाहरण के लिए, यदि आप उपयोगकर्ता और श्रेणी का उपयोग करके किसी लेख को पुनः प्राप्त करना चाहते हैं, तो आपको लिखना होगा:

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

और आप इसका उपयोग इस तरह कर सकते हैं:

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

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

एक अन्य मामले में, आपको किसी श्रेणी के सभी लेखों को पुनः प्राप्त करने या किसी विशिष्ट उपयोगकर्ता के लेखों को पुनः प्राप्त करने की आवश्यकता हो सकती है। आप इसे इस तरह लिख सकते हैं:

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

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

आप http://laravel.com/docs/5.0/eloquent पर अधिक जान सकते हैं


आपके उत्तर के लिए धन्यवाद, लेकिन मैं लार्वा 4 का उपयोग करता हूं और json फॉर्मेट द्वारा डेटा वापस करना चाहता return Response::json( array( 'total_count' => $count, 'incomplete_results' => false, 'items'=> $articles->toArray() ));हूं। इनको लाइक करें मैं json फॉर्मेट के लिए कैसे कर सकता हूं?
नाय

कोई बात नहीं सभी कोड Laravel 4 में काम करता है बस आपको नामस्थान को हटाने की आवश्यकता है, और $ लेख-> ToArray () एक ही काम करता है, कृपया प्रयास करें
आनंद पटेल

धन्यवाद भाई यह काम है और आप मेरी जान बचाते हैं :)। देर से जवाब के लिए क्षमा करें क्योंकि मैं कल में कंप्यूटर के पास नहीं हूँ।
नाय

4
मुझे यकीन नहीं है, लेकिन ऐसा लगता है कि इस तरह (वाक्पटुता का उपयोग करके) 3 प्रश्न उत्पन्न करता है। जबकि कस्टम की क्वेरी joinसिंगल होगी। तो नीचे @NayZawOo द्वारा उत्तर अधिक स्वीकार्य है।
FreeLightman 16

क्या होगा यदि मैं इसे $ लेख-> श्रेणी-> श्रेणी_नाम की तरह एक्सेस नहीं करना चाहता, लेकिन $ लेख-> श्रेणीनाम जैसे कुछ अन्य उपनामों का उपयोग करता हूं, तो मैं उस मामले में स्पष्ट क्वेरी कैसे लिखूं?
हेरोकिलर

23

प्रयत्न:

$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();

मुझे json ऑब्जेक्ट फॉर्मेट रिटर्न चाहिए। क्योंकि मुझे $ लेखों की कोशिश करने की आवश्यकता है-> गिनती () और $ लेख-> ऑफसेट ($ ऑफसेट); $ लेख-> मिलता है (सरणी ('आईडी', 'शीर्षक', 'शरीर')); लेकिन आपका तरीका उन ऑब्जेक्ट फ़ंक्शन को लागू नहीं कर सकता है। आपके समर्थन के लिए धन्यवाद।
नाय

1
वापसी प्रतिक्रिया: json ($ लेख);
नाय ज़ो ऊ

यद्यपि यह ऐसा करने का वाक्पटु तरीका नहीं है, लेकिन यह एकमात्र तरीका है यदि आप विदेशी तालिकाओं में फ़ील्ड द्वारा छांट रहे हैं। (जो मैं सुझा नहीं सकता, लेकिन कभी-कभी आवश्यक होता है)। उस वजह से, मुझे लगता है कि यह अभी भी एक बहुत ही मान्य उत्तर है। (यह सवाल पूछा गया कि तालिकाओं में कैसे शामिल किया जाता है , वाक्पटु रास्ता वास्तव में मूल क्वेरी में उन्हें कभी शामिल नहीं करता है।)
स्कीट

इस पैकेज की सहायता से आप github.com/fico7489/laravel-eloquent-join
fico7489

"हालांकि यह करने का वाक्पटु तरीका नहीं है, यह एकमात्र तरीका है यदि आप विदेशी तालिकाओं में फ़ील्ड द्वारा छँटाई कर रहे हैं।" स्कीट्स, जब आप एकमात्र तरीका कहते हैं, तो क्या आप कह रहे हैं कि लार्वा डॉक्स इस महत्वपूर्ण जानकारी को छोड़ देते हैं?
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]);

उपरोक्त प्रश्न में वफ़ादारी बाधा उल्लंघन त्रुटि है जो इस उत्तर में हल किया गया था
अक्षय कश्यप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.