2015-10-26 10 views
17

का उपयोग करके उत्सुक लोड किए गए संबंधों के साथ एक पृष्ठ पर एक मॉडल में दो मॉडल मेरे पास दो मॉडल हैं जिन्हें मैं एक समयरेखा में विलय करना चाहता हूं। मैं mysql में एक व्यू बनाकर ऐसा करने में सक्षम हूं जो तालिकाओं को सामान्य और यूनियन करता है। मैंने इस दृश्य के लिए एक मॉडल बनाया, NewsFeed। अगर मैं Comment मॉडल से संबंधित नहीं चाहता तो यह अच्छी तरह से काम करता है। मैं मॉडल पर getMorphClass विधि को ओवरराइड करके इसे बंद कर चुका हूं। यह मुझे चित्रों के लिए संबंधित टिप्पणियां प्राप्त करने की अनुमति देता है, लेकिन पोस्ट नहीं, क्योंकि जब getMorphClass कहा जाता है तो मॉडल में कोई डेटा नहीं होता है।लार्वेल

मैं इसे हल करने के तरीके के बारे में किसी भी दृष्टिकोण के लिए खुला हूं, न कि जिस तरह से मैं प्रस्तावित कर रहा हूं, लेकिन मैं डेटाबेस से अधिक डेटा खींचना नहीं चाहता हूं।

न्यूज़फ़ीड

<?php 

    namespace App\Users; 

    use App\Pictures\Picture; 
    use App\Social\Comments\CommentableTrait; 
    use App\Posts\Post; 
    use App\Users\User; 
    use Illuminate\Database\Eloquent\Model; 

    class UserFeed extends Model 
    { 
     use CommentableTrait; 

     public function user() 
     { 
      return $this->belongsTo(User::class); 
     } 

     public function getMorphClass(){ 
      if ($this->type == 'post'){ 
       return Post::class; 
      } 
      return Picture::class; 
     } 
    } 

MySQL देखें

CREATE VIEW 
    `user_feeds` 
AS SELECT 
    `posts`.`id` AS `id`, 
    `posts`.`user_id` AS `user_id`, 
    'post' AS `type`, 
    NULL AS `name`, 
    NULL AS `thumbnail`, 
    `posts`.`body` AS `body`, 
    `posts`.`updated_at` AS `updated_at`, 
    `posts`.`created_at` AS `created_at` 
FROM 
    `posts` 
UNION SELECT 
    `pictures`.`id` AS `id`, 
    `pictures`.`user_id` AS `user_id`, 
    'picture' AS `type`, 
    `pictures`.`name` AS `name`, 
    `pictures`.`thumbnail` AS `thumbnail`, 
    `pictures`.`description` AS `body`, 
    `pictures`.`updated_at` AS `updated_at`, 
    `pictures`.`created_at` AS `created_at` 
FROM 
    `pictures`; 

चित्रों तालिका

id 
    user_id 
    title 
    img 
    img_width 
    img_height 
    img_other 
    description 
    created_at 
    updated_at 

पदों

id 
    user_id 
    title 
    body 
    created_at 
    updated_at 
+0

क्या आप केवल उत्सुक लोडिंग का उपयोग नहीं कर सकते? $ var = चित्र :: के साथ ('पोस्ट', 'टिप्पणियां') ... – futureweb

+0

सबसे नज़दीक उपयोगकर्ता :: (['पोस्ट', 'चित्र']) -> प्राप्त करें(); जो आपको पेजिनेटेड सामग्री नहीं मिलती है। मैंने '$ user-> पोस्ट() -> पेजिनेट (15); 'और' $ उपयोगकर्ता-> चित्र() -> पेजिनेट (15);' फिर संग्रहों को विलय कर रहा है, लेकिन यह एक बार समस्याग्रस्त हो जाता है अतिरिक्त रिकॉर्ड सेट चाहते हैं। – whoacowboy

+0

क्यों नहीं 'उपयोगकर्ता :: के साथ ([' पोस्ट ',' चित्र ']) -> पेजिनेट (15);' या यहां तक ​​कि 'उपयोगकर्ता :: के साथ ([' पोस्ट ',' posts.comments ',' चित्र ' ]) -> पेजिनेट (15); 'और पोस्ट मॉडल पर भी एक टिप्पणी विधि खींचें? – futureweb

उत्तर

7

आप वास्तव में अपने विचार एक दृश्य का निर्माण करने के साथ करीब हैं। वास्तव में, यदि आप दृश्य के बजाय वास्तविक तालिका बनाते हैं, तो समाधान काफी सरल हो जाता है।

'फीडइटम' पॉलिमॉर्फ ऑब्जेक्ट के साथ जो आपके पोस्ट क्लास या पिक्चर क्लास को इंगित करता है, आप टिप्पणियों को सीधे फीडइटम पर जोड़ सकते हैं।

class FeedItem extends Model { 
    use CommentableTrait; 
    public function feedable() 
    { 
     return $this->morphTo(); 
    } 
} 

class Post extends Model { 
    public function feeditem() 
    { 
     return $this->morphOne('FeedItem', 'feedable'); 
    } 
} 

class Picture extends Model { 
    public function feeditem() 
    { 
     return $this->morphOne('FeedItem', 'feedable'); 
    } 
} 

यह समाधान अपने रूपों पर कुछ पुनर्रचना की आवश्यकता हो सकती है क्योंकि आप प्रत्येक पोस्ट प्रवेश और चित्र में प्रवेश के लिए एक FeedItem प्रविष्टि बनाने के लिए की आवश्यकता होगी। पिक्चर :: इवेंट और पोस्ट :: के लिए इवेंट श्रोताओं को चाल (http://laravel.com/docs/5.1/eloquent#events) करना चाहिए।

एक बार जब यह की स्थापना की है, तो आप उपयोग कर सकते हैं:

FeedItem::with('comments')->orderBy('created_at','desc')->paginate(15); 
1

हालांकि मैं और न ही उस बात के लिए Laravel से परिचित बोलने में निपुण नहीं, यहाँ इस पर मेरी इनपुट है।

मान लिया जाये कि आप $Entries

में है कि SQL देखने से उत्पादन हो रही है मैं समझता हूँ के रूप में सुवक्ता आप खुद के लिए मूल्यों को निर्धारित करने, इसलिए कुछ इस तरह आप के लिए काम कर सकते हैं (मैं वाक्य रचना के बारे में निश्चित नहीं हूँ की अनुमति देता है या उस मामले के लिए उपयोग)।

$Collection = []; 
foreach($Entries as $Entry) { 
    if($Entry->type === 'post') { 
     $Collection[] = new Post($Entry->toArray())->with('comments'); 
    }else{ 
     $Collection[] = new Picture($Entry->toArray())->with('comments'); 
    } 
} 
return $Collection;