Commit 83188a98 by Vladislav

Оптимизация

1 parent d95b16f6
...@@ -6,6 +6,7 @@ use App\Models\Tokens; ...@@ -6,6 +6,7 @@ use App\Models\Tokens;
use App\Service\API\API; use App\Service\API\API;
use App\Service\Requests\APIRequest; use App\Service\Requests\APIRequest;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Relations\HasMany;
class AdGroupsAdd extends Command class AdGroupsAdd extends Command
{ {
...@@ -40,15 +41,19 @@ class AdGroupsAdd extends Command ...@@ -40,15 +41,19 @@ class AdGroupsAdd extends Command
*/ */
public function handle() public function handle()
{ {
$tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalSynchronized.groupsForNotExternal') $tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalSynchronized.groupsForNotExternal.group')
->with([
'dictionaryCampaignsEnabledForExternalSynchronized.groupsForNotExternal.dictionaryCampaign',
'dictionaryCampaignsEnabledForExternalSynchronized.groupsForNotExternal.group',
])
->where('type', '!=', Tokens::MAIN) ->where('type', '!=', Tokens::MAIN)
->get(); ->get();
foreach ($tokens as $token) { foreach ($tokens as $token) {
$token->load([
'dictionaryCampaignsEnabledForExternalSynchronized.groupsForNotExternal' => function (HasMany $query) {
return $query->has('group');
},
'dictionaryCampaignsEnabledForExternalSynchronized.groupsForNotExternal.group',
]);
$factory = APIRequest::getInstance(API::YANDEX); $factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token); $factory->setToken($token);
......
...@@ -6,6 +6,7 @@ use App\Models\Tokens; ...@@ -6,6 +6,7 @@ use App\Models\Tokens;
use App\Service\API\API; use App\Service\API\API;
use App\Service\Requests\APIRequest; use App\Service\Requests\APIRequest;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Relations\HasMany;
class AdGroupsUpdate extends Command class AdGroupsUpdate extends Command
{ {
...@@ -40,15 +41,19 @@ class AdGroupsUpdate extends Command ...@@ -40,15 +41,19 @@ class AdGroupsUpdate extends Command
*/ */
public function handle() public function handle()
{ {
$tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalUpdated.groupsForExternalForNeedUpdated') $tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalUpdated.groupsForExternalForNeedUpdated.group')
->with([
'dictionaryCampaignsEnabledForExternalUpdated.groupsForExternalForNeedUpdated.dictionaryCampaign',
'dictionaryCampaignsEnabledForExternalUpdated.groupsForExternalForNeedUpdated.group',
])
->where('type', '!=', Tokens::MAIN) ->where('type', '!=', Tokens::MAIN)
->get(); ->get();
foreach ($tokens as $token) { foreach ($tokens as $token) {
$token->load([
'dictionaryCampaignsEnabledForExternalUpdated.groupsForExternalForNeedUpdated' => function (HasMany $query) {
return $query->has('group');
},
'dictionaryCampaignsEnabledForExternalUpdated.groupsForExternalForNeedUpdated.group',
]);
$factory = APIRequest::getInstance(API::YANDEX); $factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token); $factory->setToken($token);
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
namespace App\Console\Commands; namespace App\Console\Commands;
use App\Models\AdGroup; use App\Models\AdGroup;
use App\Models\Campaigns;
use App\Models\Keyword; use App\Models\Keyword;
use App\Models\Pivots\DictionaryCampaign; use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalAdGroup; use App\Models\Pivots\GoalAdGroup;
...@@ -42,23 +43,29 @@ class DictionaryCampaignsSyncByCampaign extends Command ...@@ -42,23 +43,29 @@ class DictionaryCampaignsSyncByCampaign extends Command
*/ */
public function handle() public function handle()
{ {
DictionaryCampaign::with([ Campaigns::has('dictionaryCampaignSynchronizedNeedSynced')->forManaged()->get()->each(function (Campaigns $campaign) {
'campaign.groups', $campaign->load([
])->synced()->needSynced()->get()->each(function (DictionaryCampaign $dictionaryCampaign) { 'groups.keywords',
'dictionaryCampaignSynchronizedNeedSynced'
]);
$campaign->dictionaryCampaignSynchronizedNeedSynced->each(function (DictionaryCampaign $dictionaryCampaign) use ($campaign) {
$campaign->groups->each(function (AdGroup $adGroup) use ($dictionaryCampaign) {
$dictionaryCampaign->campaign->groups->each(function (AdGroup $adGroup) use ($dictionaryCampaign) { $goalAdGroup = GoalAdGroup::updateOrCreateByMain($adGroup, $dictionaryCampaign);
$goalAdGroup = GoalAdGroup::updateOrCreateByMain($adGroup, $dictionaryCampaign); $adGroup->keywords->each(function (Keyword $keyword) use ($goalAdGroup, $dictionaryCampaign) {
GoalKeyword::updateOrCreateByMain($keyword, $goalAdGroup, $dictionaryCampaign);
});
$adGroup->keywords->each(function (Keyword $keyword) use ($goalAdGroup, $dictionaryCampaign) {
GoalKeyword::updateOrCreateByMain($keyword, $goalAdGroup, $dictionaryCampaign);
}); });
}); $dictionaryCampaign->update([
'synced_need' => null,
]);
$dictionaryCampaign->update([ });
'synced_need' => null,
]);
}); });
......
...@@ -42,17 +42,18 @@ class KeywordsAdd extends Command ...@@ -42,17 +42,18 @@ class KeywordsAdd extends Command
public function handle() public function handle()
{ {
$tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalSynchronized.goalKeywordsForNotExternal.keyword') $tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalSynchronized.goalKeywordsForNotExternal.keyword')
->with([
'dictionaryCampaignsEnabledForExternalSynchronized.goalKeywordsForNotExternal' => function (HasMany $query) {
return $query->has('keyword');
},
'dictionaryCampaignsEnabledForExternalSynchronized.goalKeywordsForNotExternal.keyword'
])
->where('type', '!=', Tokens::MAIN) ->where('type', '!=', Tokens::MAIN)
->get(); ->get();
foreach ($tokens as $token) { foreach ($tokens as $token) {
$token->load([
'dictionaryCampaignsEnabledForExternalSynchronized.goalKeywordsForNotExternal' => function (HasMany $query) {
return $query->has('keyword');
},
'dictionaryCampaignsEnabledForExternalSynchronized.goalKeywordsForNotExternal.keyword',
]);
$goalKeywords = $token->dictionaryCampaignsEnabledForExternalSynchronized->pluck('goalKeywordsForNotExternal') $goalKeywords = $token->dictionaryCampaignsEnabledForExternalSynchronized->pluck('goalKeywordsForNotExternal')
->collapse(); ->collapse();
......
...@@ -6,6 +6,7 @@ use App\Models\Tokens; ...@@ -6,6 +6,7 @@ use App\Models\Tokens;
use App\Service\API\API; use App\Service\API\API;
use App\Service\Requests\APIRequest; use App\Service\Requests\APIRequest;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Relations\HasMany;
class KeywordsUpdate extends Command class KeywordsUpdate extends Command
{ {
...@@ -40,14 +41,19 @@ class KeywordsUpdate extends Command ...@@ -40,14 +41,19 @@ class KeywordsUpdate extends Command
*/ */
public function handle() public function handle()
{ {
$tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalUpdated.goalKeywordsForNeedUpdated') $tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalUpdated.goalKeywordsForNeedUpdated.keyword')
->with([
'dictionaryCampaignsEnabledForExternalUpdated.goalKeywordsForNeedUpdated.keyword',
])
->where('type', '!=', Tokens::MAIN) ->where('type', '!=', Tokens::MAIN)
->get(); ->get();
foreach ($tokens as $token) { foreach ($tokens as $token) {
$token->load([
'dictionaryCampaignsEnabledForExternalUpdated.goalKeywordsForNeedUpdated' => function (HasMany $query) {
return $query->has('keyword');
},
'dictionaryCampaignsEnabledForExternalUpdated.goalKeywordsForNeedUpdated.keyword',
]);
$factory = APIRequest::getInstance(API::YANDEX); $factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token); $factory->setToken($token);
......
...@@ -46,6 +46,8 @@ use Illuminate\Support\Collection; ...@@ -46,6 +46,8 @@ use Illuminate\Support\Collection;
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaignVariables * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaignVariables
* @property-read int|null $dictionary_campaign_variables_count * @property-read int|null $dictionary_campaign_variables_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaigns * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaigns
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaignSynchronized
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaignSynchronizedNeedSynced
* @property-read int|null $dictionary_campaigns_count * @property-read int|null $dictionary_campaigns_count
* @property string|null $keywords_loaded_at * @property string|null $keywords_loaded_at
* @method static Builder|Campaigns whereKeywordsLoadedAt($value) * @method static Builder|Campaigns whereKeywordsLoadedAt($value)
...@@ -351,6 +353,11 @@ class Campaigns extends Model ...@@ -351,6 +353,11 @@ class Campaigns extends Model
return $this->dictionaryCampaigns()->synchronized(); return $this->dictionaryCampaigns()->synchronized();
} }
public function dictionaryCampaignSynchronizedNeedSynced()
{
return $this->dictionaryCampaigns()->synchronized()->needSynced();
}
public function dictionaryCampaignVariables() public function dictionaryCampaignVariables()
{ {
return $this->hasManyThrough(DictionaryCampaignVariable::class, DictionaryCampaign::class, 'campaign_id', 'dictionary_campaign_id'); return $this->hasManyThrough(DictionaryCampaignVariable::class, DictionaryCampaign::class, 'campaign_id', 'dictionary_campaign_id');
......
...@@ -36,7 +36,13 @@ class Variable extends Model ...@@ -36,7 +36,13 @@ class Variable extends Model
'default_value', 'default_value',
]; ];
public static function getListVariablesByDictionaryCampaign(DictionaryCampaign $dictionaryCampaign, $variables = null) /**
* @param string|integer|DictionaryCampaign
* @param null|Variable[] $variables
*
* @return array
*/
public static function getListVariablesByDictionaryCampaign($dictionary_campaign_id, $variables = null)
{ {
$variable_list = [ $variable_list = [
'vars' => [], 'vars' => [],
...@@ -48,7 +54,7 @@ class Variable extends Model ...@@ -48,7 +54,7 @@ class Variable extends Model
} }
foreach ($variables as $variable) { foreach ($variables as $variable) {
$dictionaryCampaignVariable = $variable->findValue($dictionaryCampaign->getKey()); $dictionaryCampaignVariable = $variable->findValue($dictionary_campaign_id);
$value = ( $value = (
$dictionaryCampaignVariable $dictionaryCampaignVariable
......
...@@ -106,7 +106,7 @@ class AddAdGroups extends DirectRequest ...@@ -106,7 +106,7 @@ class AddAdGroups extends DirectRequest
$this->setParams([ $this->setParams([
'AdGroups' => $this->goalAdGroups->map(function (GoalAdGroup $goalAdGroup) use ($variables) { 'AdGroups' => $this->goalAdGroups->map(function (GoalAdGroup $goalAdGroup) use ($variables) {
$list = Variable::getListVariablesByDictionaryCampaign($goalAdGroup->dictionaryCampaign, $variables); $list = Variable::getListVariablesByDictionaryCampaign($goalAdGroup->dictionary_campaign_id, $variables);
$data = [ $data = [
'Name' => StrReplaceByVariables::getInstance($goalAdGroup->name, $list)->get(), 'Name' => StrReplaceByVariables::getInstance($goalAdGroup->name, $list)->get(),
......
...@@ -110,7 +110,7 @@ class AddCampaigns extends DirectRequest ...@@ -110,7 +110,7 @@ class AddCampaigns extends DirectRequest
$this->setParams([ $this->setParams([
'Campaigns' => $this->dictionaryCampaigns->map(function (DictionaryCampaign $dictionaryCampaign) use ($variables) { 'Campaigns' => $this->dictionaryCampaigns->map(function (DictionaryCampaign $dictionaryCampaign) use ($variables) {
$list = Variable::getListVariablesByDictionaryCampaign($dictionaryCampaign, $variables); $list = Variable::getListVariablesByDictionaryCampaign($dictionaryCampaign->getKey(), $variables);
$data = [ $data = [
'Name' => StrReplaceByVariables::getInstance($dictionaryCampaign->name, $list)->get(), 'Name' => StrReplaceByVariables::getInstance($dictionaryCampaign->name, $list)->get(),
......
...@@ -97,10 +97,17 @@ class AddKeywords extends DirectRequest ...@@ -97,10 +97,17 @@ class AddKeywords extends DirectRequest
$variables = Variable::all(); $variables = Variable::all();
$lists = [];
$this->setParams([ $this->setParams([
'Keywords' => $this->goalKeywords->map(function (GoalKeyword $goalKeyword) use ($variables) { 'Keywords' => $this->goalKeywords->map(function (GoalKeyword $goalKeyword) use ($variables, $lists) {
$list = Variable::getListVariablesByDictionaryCampaign($goalKeyword->dictionaryCampaign, $variables); if (!isset($lists[$goalKeyword->dictionary_campaign_id])) {
$list = Variable::getListVariablesByDictionaryCampaign($goalKeyword->dictionary_campaign_id, $variables);
$lists[$goalKeyword->dictionary_campaign_id] = $list;
} else {
$list = $lists[$goalKeyword->dictionary_campaign_id];
}
$keyword = $goalKeyword->keyword; $keyword = $goalKeyword->keyword;
......
...@@ -91,7 +91,7 @@ class UpdateAdGroups extends DirectRequest ...@@ -91,7 +91,7 @@ class UpdateAdGroups extends DirectRequest
$this->setParams([ $this->setParams([
'AdGroups' => $this->goalAdGroups->map(function (GoalAdGroup $goalAdGroup) use ($variables) { 'AdGroups' => $this->goalAdGroups->map(function (GoalAdGroup $goalAdGroup) use ($variables) {
$list = Variable::getListVariablesByDictionaryCampaign($goalAdGroup->dictionaryCampaign, $variables); $list = Variable::getListVariablesByDictionaryCampaign($goalAdGroup->dictionary_campaign_id, $variables);
$data = [ $data = [
'Id' => $goalAdGroup->external_id, 'Id' => $goalAdGroup->external_id,
......
...@@ -80,7 +80,7 @@ class UpdateCampaigns extends DirectRequest ...@@ -80,7 +80,7 @@ class UpdateCampaigns extends DirectRequest
$this->setParams([ $this->setParams([
'Campaigns' => $params['dictionaryCampaigns']->map(function (DictionaryCampaign $dictionaryCampaign) use ($variables) { 'Campaigns' => $params['dictionaryCampaigns']->map(function (DictionaryCampaign $dictionaryCampaign) use ($variables) {
$list = Variable::getListVariablesByDictionaryCampaign($dictionaryCampaign, $variables); $list = Variable::getListVariablesByDictionaryCampaign($dictionaryCampaign->getKey(), $variables);
$data = [ $data = [
'Id' => $dictionaryCampaign->external_id, 'Id' => $dictionaryCampaign->external_id,
......
...@@ -88,7 +88,7 @@ class UpdateKeywords extends DirectRequest ...@@ -88,7 +88,7 @@ class UpdateKeywords extends DirectRequest
$this->setParams([ $this->setParams([
'Keywords' => $this->goalKeywords->map(function (GoalKeyword $goalKeyword) use ($variables) { 'Keywords' => $this->goalKeywords->map(function (GoalKeyword $goalKeyword) use ($variables) {
$list = Variable::getListVariablesByDictionaryCampaign($goalKeyword->dictionaryCampaign, $variables); $list = Variable::getListVariablesByDictionaryCampaign($goalKeyword->dictionary_campaign_id, $variables);
$keyword = $goalKeyword->keyword; $keyword = $goalKeyword->keyword;
......
...@@ -19,7 +19,7 @@ class StrReplaceByVariables ...@@ -19,7 +19,7 @@ class StrReplaceByVariables
{ {
if ($list instanceof DictionaryCampaign) { if ($list instanceof DictionaryCampaign) {
$dictionaryCampaign = $list; $dictionaryCampaign = $list;
$list = Variable::getListVariablesByDictionaryCampaign($dictionaryCampaign); $list = Variable::getListVariablesByDictionaryCampaign($dictionaryCampaign->getKey());
} }
foreach ($list['vars'] as $key => $var) { foreach ($list['vars'] as $key => $var) {
......
...@@ -123,7 +123,7 @@ class ReplaceByVariablesTest extends TestCase ...@@ -123,7 +123,7 @@ class ReplaceByVariablesTest extends TestCase
$this->assertEquals(2, Variable::count()); $this->assertEquals(2, Variable::count());
$this->assertEquals(1, $this->campaign->dictionaryCampaignVariables->count()); $this->assertEquals(1, $this->campaign->dictionaryCampaignVariables->count());
$list = Variable::getListVariablesByDictionaryCampaign($this->dictionaryCampaign); $list = Variable::getListVariablesByDictionaryCampaign($this->dictionaryCampaign->getKey());
$this->assertEquals('String "custom var value"', StrReplaceByVariables::getInstance('String "var"', $list)->get()); $this->assertEquals('String "custom var value"', StrReplaceByVariables::getInstance('String "var"', $list)->get());
$this->assertEquals('String "vartwo value"', StrReplaceByVariables::getInstance('String "vartwo"', $list)->get()); $this->assertEquals('String "vartwo value"', StrReplaceByVariables::getInstance('String "vartwo"', $list)->get());
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!