2013-09-27 13 views
6

मैंने एक परियोजना के लिए एक मैसेजिंग सिस्टम बनाया है जिस पर मैं काम कर रहा हूं और लगता है कि यह एक ठोकर खा रहा है।लैरवेल एलोक्वेंट पूछताछ संबंध

मैं निम्न तालिका संरचनाओं (irrelevent कॉलम स्पष्टता के लिए छोड़े गए)

messages 
------------------------- 
from_id to_id spam 

users 
------------------------- 
id group_id 

groups 
------------------------- 
id access_level 

पहुंच का स्तर बिटवाइज़ अनुमतियों का उपयोग करता है

001 read 
010 write 
100 delete 
तो

पढ़ना और लिखना, पहुंच का स्तर होगा '3 '

उपयोगकर्ताओं को साइट व्यवस्थापक द्वारा निरस्त अनुमतियां मिल सकती हैं, इसलिए मैं जो करने का प्रयास कर रहा हूं वह उन संदेशों को चुनना है जो प्रेषक अभी भी हैं लिखने की अनुमति है। निम्नलिखित

Message::with(['from' => function($query) 
{ 
    $query->with(['group' => function($_query) 
    { 
     $_query->where('access_level', '&', 2); 
    }]); 
}]) 
->where('to_id', Auth::user()->id) 
->get(); 

अपने मॉडल में इस तरह के (फिर केवल प्रासंगिक दिखाया भागों)

class User extends Eloquent { 
    public function group() { 
     return $this->belongsTo('Group'); 
    } 
} 

class Message extends Eloquent { 
    public function to() { 
     return $this->belongsTo('User', 'to_id'); 
    } 
    public function from() { 
     return $this->belongsTo('User', 'from_id'); 
    } 
} 

मैं कोशिश की है के रूप में स्थापित कर रहे हैं यह उपयोगकर्ता में करने के लिए वर्तमान में लॉग भेजे गए संदेशों को होता है, जिसमें प्रेषक समूह का पहुंच स्तर अभी भी उपयोगकर्ता को संदेश लिखने में सक्षम बनाता है (सैद्धांतिक रूप से) हालांकि यह उपयोगकर्ता को भेजे गए सभी संदेशों को वापस कर रहा है।

मैं भी विशेष रूप से समूह को लक्षित की कोशिश की है (समूहों 6 और 7 प्रतिबंध लगा रहे हैं और अपुष्ट खाते):

Message::with(['from' => function($query) 
{ 
    $query->whereNotIn('group_id', [6,7]) 
}]) 
->where('to_id', Auth::user()->id) 
->get(); 

जो भी उपयोगकर्ता के लिए गए संदेशों के सभी देता है।

tl;dr

कैसे, सुवक्ता का उपयोग कर, मैं जहां प्रेषकों समूह लिखने की अनुमति है एक उपयोगकर्ता के लिए भेजे गए सभी संदेशों का चयन करेंगे?

edit

बेशक

, ::with, संदेश जो खींच लिया हो कोई असर नहीं पड़ेगा, क्योंकि यह केवल में शामिल हो गए टेबल के आलसी लोड हो रहा है है।

उत्तर

8

मेरे समाधान यह करने के लिए किया गया था:

Message::select(DB::raw("messages.*")) 
    ->join("users AS from", "from.id", "=", "from_id") 
    ->join("groups", "groups.id", "=", "from.group_id") 
    ->whereRaw("groups.access_level & 2 = 2") 
    ->where('to_id', '=', Auth::user()->id); 

करता है कौन सा वास्तव में क्या मैं इसे करना चाहता था।

जैसा कि मेरे प्रश्न ::with में बताया गया है केवल डेटा की लोडिंग को प्रभावित करता है।

4

इस बारे में कैसे?

Message::with(['from' => function($query){ 
       $query->where('group_id', '=', '2'); 
    }]) 
    ->where('to_id', Auth::user()->id) 
    ->get(); 

क्या आपने एक निश्चित group_id के लिए "से" फ़िल्टर करने का प्रयास किया है, जैसे 2? मुझे लगता है कि इस तरह की एक क्वेरी को आपके परिणामों को सही तरीके से फ़िल्टर करना चाहिए।

+0

समस्या यह है कि न केवल समूह 2 में लोग संदेश लिखने में सक्षम होंगे, इसलिए मुझे यह जांचने की आवश्यकता है कि उपयोगकर्ता समूह अनुमतियों में 'लेखन' अनुमति है, और ':: साथ' भी प्रभावित नहीं करता है मुख्य मॉडल, बस उत्सुक (ly) -loaded मॉडल। –

संबंधित मुद्दे