मेरे पास इस तरह से संबंधित 3 वर्ग हैं:
Exhibitor
'- Bills
'- Tickets
बिल और टिकट दोनों सॉफ्टडेलेट्स विशेषता का उपयोग करते हैं और प्रदर्शक वर्ग पर मेरा यह संबंध है:
public function tickets()
{
return $this->hasManyThrough(Ticket::class, Bill::class);
}
मुझे हटाए गए टिकटों (withTrashed
) सहित सभी टिकट लाने की जरूरत है, लेकिन इसमें सभी हटाए गए बिलों को भी शामिल करना होगा। समस्या यह है कि ट्रैशेड केवल टिकट मॉडल पर लागू होता है, बिलों पर नहीं।
यह प्रश्न
$tickets = exhibitor()->tickets()->withTrashed()
->where('bills.updated_at', '>=', Carbon::parse($since))
->orderBy('tickets.id')
->get();
यह एसक्यूएल उत्पन्न करता है
select `tickets`.*, `bills`.`exhibitor_id` from `tickets`
inner join `bills` on `bills`.`id` = `tickets`.`bill_id`
where `bills`.`deleted_at` is null
and `bills`.`exhibitor_id` = ?
and `bills`.`updated_at` >= ?
order by `tickets`.`id` asc
जबकि मुझे "bills
के बिना इस SQL की आवश्यकता होनी चाहिए। deleted_at
शून्य है" इस तरह:
select `tickets`.*, `bills`.`exhibitor_id` from `tickets`
inner join `bills` on `bills`.`id` = `tickets`.`bill_id`
where `bills`.`exhibitor_id` = ?
and `bills`.`updated_at` >= ?
order by `tickets`.`id` asc
लेकिन मुझे कोई विकल्प नहीं दिख रहा है जहां मैं बिल मॉडल के लिए withTrashed () सेट कर सकता हूं। मैंने सोचा कि हैमनीथ्रू विधि पर कॉलबैक क्वेरी सेट करना संभव होना चाहिए, लेकिन एपीआई के मुताबिक इसके लिए कोई समर्थन नहीं है। यह बहुत आसान लगता है और मुझे लग रहा है कि मैं कुछ देख रहा हूं, लेकिन मुझे यह नहीं मिल रहा है ...
2 जवाब
यह इस समय संभव नहीं है: https://github.com/laravel/framework/issues/ 23039
यदि आपको बाहरी पैकेज स्थापित करने में कोई आपत्ति नहीं है, तो आप मेरे द्वारा बनाए गए इस पैकेज का उपयोग कर सकते हैं: https://github.com/saudenmeir/eloquent-has-many-deep
class Exhibitor extends Model
{
use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
public function tickets()
{
return $this->hasManyDeep(Ticket::class, [Bill::class])
->withTrashed('bills.deleted_at');
}
}
मैं टिकट मॉडल पर एक दायरा परिभाषित करूंगा क्योंकि क्वेरी थोड़ी जटिल हो रही है।
public function scopeBillsSince($query, $since)
return $query->whereHas('bills', function ($query2) use ($since) {
return $query2->withThrashed()->where('updated_at', '>=', Carbon::parse($since))
});
}
उस दायरे का उपयोग करके अब आप टिकटों को इस तरह से पूछ सकते हैं:
$tickets = exhibitor()->tickets()->withTrashed()->billsSince($since);
संबंधित सवाल
नए सवाल
laravel
लारवेल एक स्वतंत्र, ओपन-सोर्स PHP वेब फ्रेमवर्क है, जो टेलर ओटवेल द्वारा निर्मित और मॉडल-व्यू-कंट्रोलर (एमवीसी) आर्किटेक्चरल पैटर्न और सिम्फनी पर आधारित वेब अनुप्रयोगों के विकास के लिए अभिप्रेत है। लारवेल का स्रोत कोड GitHub पर होस्ट किया गया है और MIT लाइसेंस की शर्तों के तहत लाइसेंस प्राप्त किया गया है।