2014-07-25 4 views
0

Хорошо, ребята, я пытаюсь перефразировать мой вопрос. Посмотрим, как работает попытка 2:Laravel ManyToMany - та же модель

У меня есть команда artisan для вычисления общего дохода для каждого пользователя.

Каждый день Пользователь получает прибыль. Но как-то, как я должен его описывать, он зарабатывал деньги от других пользователей.

И вот столбец assert_user_id. Если пользователь (пользователь 2) сделал прибыль с помощью материала от другого пользователя (пользователя 1), эти доходы должны быть добавлены к заработкам пользователя 1 в этом сценарии.

id, user_id, earnings, asset_user_id 
1, 1,  15,  null 
2, 1,  43,  null 
3, 1,  49,  null 
4, 2,  32,  1 
5, 2,  25,  1 
6, 2,  12,  null 

(В этом случае пользователь 2 делает почти все свои деньги, с содержанием от пользователя 1 ... не очень мило с его стороны, то почему деньги)

Команды Artisan получает все пользователи , и проходит через них с помощью foreach.

внутри Еогеасп мы называем метод на модели пользователя

return $this->sum('earnings');

помню, я в коллекции пользователя 1.

А теперь я хочу, чтобы суммировать все доходы, где это asset_user_id = 1. Проблема состоит в том, что в коллекции сохраняются только строки пользователя 1.

Теперь вопрос:

Как я могу получить доступ ко всем остальным строкам из коллекции пользователя. Yeha я мог просто выполнить User: all() в моей функции в моей модели. Но я не думаю, что это будет SOLID-код. Так как я делаю это правильно?

+0

Похоже, вы спрашиваете о MySQL , а не ларавел. У вас уже есть запрос sql, который вы хотите преобразовать? Или вы спрашиваете, как это сделать, повторяя сбор? – Benubird

+0

Как запросить это легко. Это не проблема. Но да, я хочу сделать это по модели/коллекции создателя. Я получаю всех создателей с помощью foreach, а затем получаю total1 над коллекцией. Теперь я блокируюсь, чтобы получить простой способ получить total2 над коллекцией. – mfsymb

+0

Перефразируйте свой вопрос, чтобы мы знали, каков ваш ожидаемый результат. Как выглядит модель Eloquent и отношения «многие-ко-многим»? –

ответ

0

Что вы, вероятно, захотите сделать, это перебрать коллекцию с помощью foreach и получить суммы самостоятельно.

$results = Result::all(); 

$sum1 = 0; 
$sum2 = 0; 

foreach($results as $result) { 
    if($result->creator_id == 1 && $result->status = 'r') { 
     $sum1 += (int)$result->earnings; 
    } 

    if($result->asset_creator_id == 1 && $result->status = 'r') { 
     $sum2 += (int)$result->earnings; 
    } 
} 

Существует также метод sum в Collection класса, который мог бы быть немного легче. Просто отправьте ему обратный вызов, который возвращает значение, которое вы ищете. Мы должны были бы сделать это дважды, хотя, раз за каждую сумму, которую вы ищете.

$sum1 = $results->sum(function($result) 
{ 
    if($result->creator_id == '1' && $result->status = 'r') { 
     return $result->earnings; 
    } 
}); 

$sum2 = $results->sum(function($result) 
{ 
    if($result->asset_creator_id == '1' && $result->status = 'r') { 
     return $result->earnings; 
    } 
}); 

echo "Creator Earnings: ".$sum1; 
echo "Asset Creator Earnings: ".$sum2; 
0

Сортировка, подсчет, суммирование по коллекции всегда будут худшим решением, чем выполнение этого запроса db.

В любом случае ваш вопрос неаккуратен, вы просите status=r, написать общий для status=f, так просто догадку, чтобы показать вам, как вы можете сделать это с красноречивыми особенностями:

public function getEarningsForAssetCreator($id) 
{ 
    return $this->where('asset_creator_id', $id) 
      ->where('status', 'f') 
      ->sum('earnings'); 
} 
+0

haha ​​:) yeha my qustion немного беспорядочен, я не уверен, как я могу объяснить свою проблему лучше всего. Но ваш ответ не ответил на мой вопрос. Проблема в том, что я получаю всех создателей. Итак, я в коллекции создателя 1. Но данные, которые я хочу, находятся в коллекции Creator 2 и не находятся в коллекции создателя 2. Так что я думал, может быть, добавить отношение к той же таблице, но другая модель и внешние ключи разные. вместо id -> creator_id, возможно, id -> asset_creator_id. Или что-то вроде этого. – mfsymb

+0

Хорошо, забудьте об этой коллекции пока и скажите мне, что ожидается результат? –

+0

Ожидаемый результат: получить все строки с активом_creator_id = 1 из коллекции создателя 1, который содержит только строки создателя 1. Но asset_creator_id = 1 строки находятся только в строках других создателей. – mfsymb

Смежные вопросы