重构 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 并从中扩展所有模型
有没有办法重构这个函数?我想在回调中重用重复的代码。我不知道从哪里开始,我不仅有这两种方法我还有更多,重新使用重复的代码会很有帮助。
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 并从中扩展所有模型