2016-10-08 2 views
0

Я пытаюсь сделать предложение where в методе withCount для красноречивого построителя запросов laravel, используя этот кусок кода.Laravel, используя предложение where в методе withCount

$posts = Post::withCount('upvotes')->where('upvotes_count', '>', 5)->get(); 

и этот код дает мне эту ошибку.

SQLSTATE [42S22]: Колонка не найден: одна тысяча пятьдесят-четыре Неизвестный столбец 'upvotes_count' в 'где предложение' (SQL: выберите , (выберите отсчет () от upvotes где upvotesupvoteable_id = postsid и upvotes.. . upvoteable_type = App \ Post), как upvotes_count из posts где upvotes_count> 5)

так от того, что я могу предположить, что это upvotes_count не выбран, и, следовательно, столбец не найден, но если я выполняю-й является частью кода.

$posts = Post::withCount('upvotes')->get(); 

Тогда я получаю этот выход.

{ 
"id": 1, 
"user_id": 15, 
"title": "Voluptatum voluptas sint delectus unde amet quis.", 
"created_at": "2016-10-07 13:47:48", 
"updated_at": "2016-10-07 13:47:48", 
"upvotes_count": 7 
}, 
{ 
"id": 2, 
"user_id": 2, 
"title": "Molestiae in labore qui atque.", 
"created_at": "2016-10-07 13:47:48", 
"updated_at": "2016-10-07 13:47:48", 
"upvotes_count": 2 
}, 

Который в основном означает, что upvotes_count будет выбран, следовательно, я действительно путают о том, как решить эту проблему.

(Другие варианты, которые я пытался до сих пор приведены ниже с соответствующей ошибкой, связанной с ним.)

$posts = Post::where('id', $id)->withCount(['upvotes' => function($query) { 
     $query->where('upvotes_count', '>', 5); 
    }])->get(); 

ошибка.

SQLSTATE [42S22]: Колонка не найдено: 'upvotes_count' не поддерживается (вперед ссылка в списке элементов) 1247 Reference (SQL: выберите , (SELECT COUNT () из upvotes, где upvotesupvoteable_id = posts.. id и upvotes. upvoteable_type = App \ сообщение и upvotes_count> 5) в качестве upvotes_count из posts, где id = 1)

код.

$posts = Post::where('id', $id)->with(['upvotes' => function($query) { 
     $query->select('upvoteable_id AS upvotes_count'); 
    }])->where('upvotes_count', '>', 5)->get(); 

И

$posts = \App\Post::where('id', $id)->with(['upvotes' => function($query) { 
     $query->selectRaw('upvoteable_id AS upvotes_count'); 
    }])->where('upvotes_count', '>', 5)->get(); 

ошибка.

SQLSTATE [42S22]: Column не найдено: 1054 Неизвестный столбец 'upvotes_count' в 'где предложение' (SQL: SELECT * FROM posts где id = 1 и upvotes_count> 5)


Я просто хочу использовать where where для метода count(), который находится в отношениях с родительской моделью.

ответ

-1

Убедитесь, что у вас столбец в базе данных под названием «upvotes_count» может быть функция withCount возвращение upvotes_count не ваш DB так и будет не получить upvotes_count, потому что не существует

+0

Там нет столбца называется «upvotes_count» в таблице, как я, выбрав его с помощью метода withCount(), который приводит в добавлении этого столбца «upvotes_count» в экземпляр построителя запросов. – Drazxier

+0

Не могли бы вы рассказать мне, какова ваша проблема в одной строке? , потому что я вижу, что вы пытаетесь сделать предложение where, предлагающее db принести строки, у которых upvotes меньше числа, и нет столбца, который называется upvotes count, и вы знаете, что: D в чем проблема сейчас? –

+3

Мне бы хотелось поговорить с вами, и поскольку SO-комментарии не лучшее место для этого, давайте продолжим наш разговор в facebook. – Drazxier

1

я столкнулся с той же проблемой, и попробовал то же самое, что и вы. Я предполагаю, что есть способ реплицировать SQL, сгенерированный вызовом withCounts, но добавить способ сделать xxx_counts доступными для предложения where, но я просто отфильтровал полученную коллекцию.

$allTags = Tag::withCount('articles')->get(); 

$usedTags = $allTags->filter(function ($value, $key) { 
     return $value->articles_count > 0; 
    }); 
+1

Прошло довольно много времени, и, когда я узнал больше о sql, вы не можете выполнять предложения о агрегатных функциях, поэтому столбец upvotes_count не найден, поскольку он агрегирован и не выбран. , но вышеуказанная проблема может быть решена с использованием некоторых расширенных запросов и группировки их вместе. – Drazxier

1

Если вам нужно выбрать только те строки, что счетчик больше или равно 1, вы можете попробовать код последующей:

$posts = Post::withCount('upvotes') 
      ->havingRaw('upvotes_count') 
      ->get(); 

Я не знаю, если это лучшее решение, но это альтернатива. Другая альтернатива - получить сообщения и использовать фильтр массива, как указано в комментарии выше.

1

Вы можете достичь требуемого результата с помощью:

$posts = Post::withCount('upvotes') 
     ->having('upvotes_count', '>', 5) 
     ->get(); 
+0

Это должен быть принятый ответ! – JCarlos

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