Я ищу решение, которое извлекло бы важные данные, используемые для сопоставления других данных из другой таблицы. Затем я хотел бы отобразить эти данные внутри лезвия в виде таблицы.
Внутри базы данных у меня есть «совпадающая» сущность, которая хранит учетные данные пользователя, которые я бы хотела использовать для сопоставления (например, желаемая цена продукта). Сущность содержит «peopleID», поскольку «соответствие» принадлежит пользователям сайта. Когда пользователь создается, мы назначаем соответствующие параметры, которые сохраняются внутри этого «соответствующего» объекта. Количество строк внутри совпадающей сущности зависит от количества округов, выбранных на этапе создания пользователя.
Я знаю, что для удаления соответствующих данных из базы данных мне нужно использовать цикл foreach.
У меня проблема, когда я вывожу данные внутри блейда. По какой-то причине он сопоставляет товары только с последним элементом массива. Он должен соответствовать продуктам со всеми соответствующими учетными данными.
Код:
$matchings = Match::where('PeopleID', '=', $id)->get();
$sales = DB::table('sales');
foreach ($matchings as $matching)
{
$county = $matching->county;
$sales->where('county', '=', $county);
}
$results = $sales->get();
Так что для одного из клиентов у меня есть два совпадения с разными «округами». Он отображает данные только за последний добавленный. Как я могу сделать так, чтобы отображались данные для другого соответствия, которое содержит другой округ. Я надеюсь, вы понимаете, о чем я.
Спасибо за любую помощь.
Обновление — основная часть кода выполнена. Спасибо за помощь.
Второй вопрос касается добавления остальных опций соответствия. Как указывалось ранее, количество матчей зависит от количества добавленных округов. Каждое совпадение имеет свои атрибуты. Идея состоит в том, чтобы показать соответствующие результаты для каждого округа.
Я знаю, что для этого понадобятся некоторые заявления if.
Вот пример, который я хотел бы реализовать:
$maxprice = $match->maxprice;
$minprice = $match->minprice;
$brand_a = $match->brand_a;
$brand_b = $match->brand_b;
if($maxprice != '0')
{
$sales = DB::table('sales')->where('maxprice', '<=', $maxprice);
}
if($minprice != '0')
{
$sales = DB::table('sales')->where('minprice', '>=', $minprice);
}
if($brand_a == '1')
{
$sales = DB::table('sales')->where('brand_a', '1');
}
if($brand_b == '1')
{
$sales = DB::table('sales')->where('brand_b', '1');
}
К этому коду:
$user = User::find($id); // get our User with the Id (person id?)
$matches = $user->matches; // get all the matches
// or you could one line the above: $matches = User::find($id)->matches;
// get all the counties in the returned matches, could use pluck() method in higher version of laravel
$counties = [];
foreach($matches as $match) {
$counties[] = $match->county;
}
$results = DB::table('sales')->whereIn('county', $counties)->get();
Большое спасибо за вашу помощь!
@Обновить
Отношения:
Матч:
public function people()
{
return $this->belongsTo('People', 'PeopleID', 'PeopleID');
}
Люди:
public function matches()
{
return $this->hasMany('Match', 'PeopleID', 'PeopleID');
}
У меня есть связь между ними, поскольку Match хранит учетные данные «поиска». Первое решение, которое вы предоставили, работает отлично. Теперь это решение отфильтровывало продажи по округам, что является хорошим шагом, поскольку теперь их нужно фильтровать по минимальной и максимальной цене (minprice, maxprice) и другим учетным данным, таким как brand_a и brand_b.
Идея brand_a и brand_b:
Флажки отвечают за изменение значений brand_a и brand_b в Matching. Если они проверены, значения внутри Соответствующей сущности становятся ‘1’. Если они не проверены, они становятся ‘0’, что означает, что продажи не должны быть отфильтрованы по этим значениям.
Сбытовая сущность содержит атрибут «Holdings». Значение «Holdings» может быть brand_a или brand_b. Продажа также содержит «Цена».
Итак, чтобы прояснить это:
Объект продажи содержит: SaleID, Price, Holdings, County.
Владения — это ценности: brand_a или brand_b.
Цена это просто число.
Графство — простой текст.
Соответствующий объект содержит: PeopleID, MinimumPrice, MaximumPrice, brand_a, brand_b, county.
PeopleID — это внешний ключ. Нам нужно знать, какое соответствие принадлежит тому или иному пользователю.
(может быть несколько совпадений для одного пользователя в зависимости от количества выбранных округов).
MinimumPrice и MaximumPrice являются числами.
brand_a и brand_b — значения (1 или 0) в зависимости от того, были ли установлены флажки.
Округ — это название округа.
Теперь, если человек 1543 (peopleID = 1543) содержит 3 совпадения, каждое из которых содержит разные учетные данные для поиска.
первая:
PeopleID: 1543
Минимальная цена: 1000
Максимальная цена: 7000
brand_a: 0
brand_b: 1
county: county_a
второй:
PeopleID: 1543
Минимальная цена: 2500
Максимальная цена: 10000
brand_a: 1
brand_b: 1
county: county_f
третий:
PeopleID: 1543
Минимальная цена: 2000
MaximumPrice: 9500
brand_a: 0
brand_b: 0
county: county_d
Мне нужно сопоставить эти данные с данными, которые находятся внутри продаж. Там может быть более 1000 различных продаж с разными ценами и т. Д. Мне просто нужно отфильтровать их и отобразить продажи, которые желает человек, на основе соответствия человека.
Я надеюсь, что это лучше представляет вам ситуацию. Благодарю.
Короче говоря, я верю, что вам нужно использовать Красноречивые Отношения легко получить данные, которые вы хотите. Читайте об отношениях в документах здесь: https://laravel.com/docs/4.2/eloquent#relationships.
Я сделал несколько предположений, поэтому вам, возможно, придется внести следующие изменения в ваши фактические настройки. Кроме того, мне было довольно сложно на 100% понять структуру вашей БД из вашего вопроса, но из того, что я понял из вашего вопроса, ваша структура БД выглядит следующим образом:
User/Person *has many* Match
(Примечание: имя может быть неправильным, но вы не упомянули, как оно называется в вопросе, все, что я вижу, это слова «user» и «personId»)
Match *belongs to* User/Person
Исходя из этого, я думаю, что вы должны установить свои отношения следующим образом:
пользователь
класс User расширяет Eloquent {
public function matches()
{
return $this->hasMany('Match');
}
//...
}
Матч
Класс Match расширяет Eloquent {
public function user()
{
return $this->belongsTo('User');
}
//...
}
Тогда ваш код может выглядеть так:
$user = User::find($id); // get our User with the Id (person id?)
$matches = $user->matches; // get all the matches
// or you could one line the above: $matches = User::find($id)->matches;
// get all the counties in the returned matches, could use pluck() method in higher version of laravel
$counties = [];
foreach($matches as $match) {
$counties[] = $match->county;
}
$results = DB::table('sales')->whereIn('county', $counties)->get();
Лучшим подходом к этому вопросу (я думаю) было бы дать County
тогда это собственная сущность Match
будет иметь county_id
тогда вы можете использовать имеет много через отношения, если вы можете связать Match
, County
а также Sales
, Вы можете прочитать больше о имеет много через в документах здесь: https://laravel.com/docs/4.2/eloquent#has-many-through
Кроме того, побочный момент … эта часть вашего кода:
$sales->where('county', '=', $county);
я просто буду постоянно добавлять операторы запроса к вашему запросу, которые, как я себе представляю, ничего не будут возвращать, если их больше одного.
Просто чтобы прояснить ситуацию, представьте, что у вас есть 2 округа «county_1» и county «county_2», и через ваш цикл for ваш запрос будет выглядеть так:
WHERE COUNTY = "county_1" // first loop
AND COUNTY = "county_2" // second loop
и как вы можете увидеть матч не могу быть двумя округами одновременно! Так что вы, вероятно, искали ->orWhere('county', 'county_value')
после добавления первого, но лучше использовать whereIn('county', $countiesArray)
который вы можете передать массив, который вы создали, что я и сделал выше.
Надеюсь это поможет! Дайте мне знать, если это не ясно.
редактировать
лучший подход будет устанавливать отношения между Sale
а также Match
юридические лица. Поскольку я до сих пор не до конца понимаю вашу схему базы данных, я не могу так хорошо посоветовать, как бы вы подошли к этому. Если бы вы дали более подробную информацию, это может быть возможно.
В качестве альтернативы, вы можете подойти к коду, создав массив, который вы будете использовать для применения условий к вашему запросу. Рассмотрите ваш обновленный вопрос с четырьмя операторами if, каждый раз, когда вы повторяете себя таким образом, чаще всего это нельзя упростить.
$filters = [
'maxprice' => $match->maxprice,
'minprice' => $match->minprice,
'brand_a' => $match->brand_a,
'brand_b' => $match->brand_b,
];
$salesQuery = DB::table('sales');
foreach($filters as $key => $value) {
if($value) {
$salesQuery->where($key, $value);
}
}
$results = $salesQuery->get();
Поскольку ваши условия немного строже в вашем коде из вашего вопроса, вы делаете это следующим образом:
foreach($filters as $key => $value) {
if ($value) {
if (in_array(['brand_a', 'brand_b'], $key)) {
$salesQuery->where($key, $value);
} else if($key === 'minprice') {
$salesQuery->where($key, '>=' $value);
} else if($key === 'maxprice') {
$salesQuery->where($key, '<=' $value);
}
}
}
Преимущество этого подхода в том, что вы можете легко добавлять новые условные выражения через массив фильтров без необходимости каждый раз писать новый оператор if и код запроса / где.
Подчеркну, что это, вероятно, не лучший подход, в идеале вы должны использовать Eloquent Relationships, но это может быть отправной точкой, если вы не можете понять это сразу.
Других решений пока нет …