ความสัมพันธ์ในการแคชโหลดอย่างกระตือรือร้นในโมเดล (ป้องกัน $ ด้วย) ด้วย Laravel และ Eloquent

ในโมเดล Article ของฉัน ฉันกระตือรือร้นที่จะโหลดความสัมพันธ์ของหมวดหมู่ภายในโมเดล:

protected $with = array('category');

เมื่อฉันได้รับบทความในคอนโทรลเลอร์ ฉันจะแคชผลลัพธ์ของทั้งบทความและความสัมพันธ์ที่ฉันอยากโหลดไว้ที่นั่น:

$articles = Article::with([
   'owner' => function ($q) {$q->remember(10);},
   'tags' => function ($q) {$q->remember(10);},
   'thumbnail' => function ($q) {$q->remember(10);}
   ])
   ->remember(10)->get();

แต่; article.category ไม่ถูกแคช ฉันคิดว่ามันจะถูกแคชพร้อมกับโมเดล Article เนื่องจากมีความกระตือรือร้นที่จะโหลดในโมเดลนั้น แต่สิ่งนี้ไม่ได้เกิดขึ้น

อย่างไรก็ตาม มันจะถูกแคชหากฉันต้องการโหลด (พร้อมแคช) ในคอนโทรลเลอร์โดยเพิ่มสิ่งนี้ลงใน Article::with ของฉัน:

'category' => function ($q) {$q->remember(10);}

ฉันรู้ว่าฉันสามารถ remember() ความสัมพันธ์ได้:

public function category()
{
    return $this->belongsTo('Category', 'category_id')->remember(10);
}

แต่จากนั้นมันจะถูกแคชอยู่เสมอ ฉันต้องการกำหนดว่าแคชนั้นจะถูกแคชในคอนโทรลเลอร์นานเท่าใดและนานแค่ไหน เนื่องจากค่าอาจแตกต่างกันไปตามการใช้งาน

เป็นไปได้ไหม? หรือต้องกำหนดแคชในโมเดล เนื่องจากการโหลดที่กระตือรือร้นเกิดขึ้นที่นั่น


person Thomas Jensen    schedule 07.10.2014    source แหล่งที่มา
comment
เพียงใช้ with('category' => ... ในคอนโทรลเลอร์ของคุณ   -  person Jarek Tkaczyk    schedule 08.10.2014
comment
ฉันทำการทดสอบเมื่อคืนนี้และได้ข้อสรุปเดียวกัน ฉันสังเกตเห็นว่าฉันลงเอยด้วยการโหลดความสัมพันธ์ของส่วนประกอบโดยไม่จำเป็นจำนวนมาก ขอบคุณสำหรับข้อมูลของคุณเกี่ยวกับเรื่องนี้ :)   -  person Thomas Jensen    schedule 08.10.2014
comment
ด้วยความยินดี. คุณอาจต้องการแยกสิ่งนี้ไปยังที่เก็บ ดังนั้นคุณไม่ต้องยัดตรรกะทั้งหมดนั้นให้กับคอนโทรลเลอร์ของคุณ และแหล่งเก็บข้อมูลก็กำลังอินเทรนด์ในปัจจุบัน ;)   -  person Jarek Tkaczyk    schedule 08.10.2014
comment
ฉันเคยเห็นสำนวนนี้ปรากฏขึ้นแล้ว แต่ฉันไม่คุ้นเคย (นอกโลกคอมไพล์) ดูเหมือนว่าฉันมีงานวิจัยรออยู่ข้างหน้า ขอบคุณอีกครั้ง :) โอ้ ฉันจะเพิ่มลิงก์ไปยังไซต์ SOFTonSOFA ของคุณเมื่อไซต์ของฉันพร้อมใช้งาน แหล่งข้อมูล Eloquent ที่ยอดเยี่ยม ยกนิ้วให้   -  person Thomas Jensen    schedule 08.10.2014
comment
ค้นหารูปแบบพื้นที่เก็บข้อมูลเพื่อเรียนรู้เพิ่มเติม ในพื้นที่เก็บข้อมูล laravel world ส่วนใหญ่อ้างถึงสิ่งที่เป็นนามธรรมเหนือเลเยอร์การจัดเก็บข้อมูล (ไม่ว่าจะเป็น db และฝีปากหรืออย่างอื่น) ที่จะแยกตัวควบคุมของคุณออกจากเอ็นจิ้นการคงอยู่ที่คุณใช้อยู่ และที่สำคัญกว่านั้นคือช่วยให้ทดสอบโค้ดของคุณได้ง่ายขึ้น   -  person Jarek Tkaczyk    schedule 08.10.2014
comment
@JarekTkaczyk หากคุณใส่สิ่งนี้ในรูปแบบของคำตอบฉันจะยอมรับมัน   -  person Thomas Jensen    schedule 17.10.2014


คำตอบ (1)


เพียงใช้ with('category' => ... ในคอนโทรลเลอร์ของคุณ

คุณอาจต้องการแยกสิ่งนี้ไปยังที่เก็บ ดังนั้นคุณไม่ต้องยัดตรรกะทั้งหมดนั้นให้กับคอนโทรลเลอร์ของคุณ และแหล่งเก็บข้อมูลก็กำลังอินเทรนด์ในปัจจุบัน ;)

ค้นหารูปแบบพื้นที่เก็บข้อมูลเพื่อเรียนรู้เพิ่มเติม

ในพื้นที่เก็บข้อมูล laravel world ส่วนใหญ่อ้างถึงสิ่งที่เป็นนามธรรมเหนือเลเยอร์การจัดเก็บข้อมูล (ไม่ว่าจะเป็น db และฝีปากหรืออย่างอื่น) ที่จะแยกตัวควบคุมของคุณออกจากเอ็นจิ้นการคงอยู่ที่คุณใช้อยู่

และที่สำคัญกว่านั้นคือช่วยให้ทดสอบโค้ดของคุณได้ง่ายขึ้น

person Jarek Tkaczyk    schedule 17.10.2014