重构 Eloquent 个回调

Refactor Eloquent callbacks

有没有办法重构这个函数?我想在回调中重用重复的代码。我不知道从哪里开始,我不仅有这两种方法我还有更多,重新使用重复的代码会很有帮助。

public static function addedPaginatedUrls($crawl_id, $cmp_crawl_id) {
    return UrlStatus::paginated($crawl_id)
        ->whereNotIn('url.url', function ($sql) use($cmp_crawl_id) {
            // START REPEATED CODE
            $sql->select('url.url')->from('url_status')
            ->join('url', 'url.id', '=', 'url_status.url_id')
            ->join('crawl', 'crawl.id', '=', 'url_status.crawl_id')
            ->where('url_status.crawl_id', '=', $cmp_crawl_id)
            // END REPEATED CODE
            ->where('url_status.pagination', '<>', '')
            ->whereNotNull('url_status.pagination');
        });
}

public static function addedCanonicalUrls($crawl_id, $cmp_crawl_id) {
    return UrlStatus::canonical($crawl_id)
        ->whereNotIn('url.url', function ($sql) use($cmp_crawl_id) {
            // START REPEATED CODE
            $sql->select('url.url')->from('url_status')
            ->join('url', 'url.id', '=', 'url_status.url_id')
            ->join('crawl', 'crawl.id', '=', 'url_status.crawl_id')
            ->where('url_status.crawl_id', '=', $cmp_crawl_id)
            // END REPEATED CODE
            ->whereNotNull('url_status.canonical');
        });
}

你可以在你的模型上创建一个静态方法,虽然我不知道这是否有意义,因为我不知道你所有的应用程序逻辑。

在您的 UrlStatus 模型中:

public static function repeatedCodeRefractoringNameItWhateverYouWant($sql, $cmp_crawl_id){
    // START REPEATED CODE
    return $sql->select('url.url')->from('url_status')
    ->join('url', 'url.id', '=', 'url_status.url_id')
    ->join('crawl', 'crawl.id', '=', 'url_status.crawl_id')
    ->where('url_status.crawl_id', '=', $cmp_crawl_id);
    // END REPEATED CODE
}

然后在您的代码中静态调用它:

public static function addedPaginatedUrls($crawl_id, $cmp_crawl_id) {
    return UrlStatus::paginated($crawl_id)
        ->whereNotIn('url.url', function ($sql) use($cmp_crawl_id) {
            // START REPEATED CODE
            UrlStatus::repeatedCodeRefractoringNameItWhateverYouWant($sql, $cmp_crawl_id)
            // END REPEATED CODE
            ->where('url_status.pagination', '<>', '')
            ->whereNotNull('url_status.pagination');
        });
}

public static function addedCanonicalUrls($crawl_id, $cmp_crawl_id) {
    return UrlStatus::canonical($crawl_id)
        ->whereNotIn('url.url', function ($sql) use($cmp_crawl_id) {
            // START REPEATED CODE
            UrlStatus::repeatedCodeRefractoringNameItWhateverYouWant($sql, $cmp_crawl_id)
            // END REPEATED CODE
            ->whereNotNull('url_status.canonical');
        });
}

如果应该由部分或所有模型共享此重复代码,只需使用此方法创建一个新模型 class 并从中扩展所有模型