मेरे पास इस तरह से संबंधित 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
Fluxlicious 1 मार्च 2019, 12:29

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');
    }
}
4
Jonas Staudenmeir 1 मार्च 2019, 12:43

मैं टिकट मॉडल पर एक दायरा परिभाषित करूंगा क्योंकि क्वेरी थोड़ी जटिल हो रही है।

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);
0
namelivia 1 मार्च 2019, 12:47