Я пытался получить все строки с одинаковым значением в моей БД, я пытаюсь получить его с помощью контроллера laravel, у меня есть таблица с именем столбца uuid, который имеет uuid пользователей, может быть несколько строк с тот же uuid, я хочу получить все данные строк с одним и тем же uuid, в настоящее время я получаю только данные первой строки.
вот моя функция контроллера:
public function show($id)
{
$cartProduct = add_product_cart::where('uuid', $id)->first();
if (!$cartProduct) {
return new ErrorResource('Data not found');
}
return new InvestmentResource($cartProduct);
}
Я использую API следующим образом:
http://localhost:8000/api/investment/1234
//1234 is the uuid
//I get the payload like this:
"data": {
"id": 1,
"uuid": "1234",
"email": "[email protected]",
"product_name": "test product",
"product_price": "5000",
},
"status": true
}
Я могу получить первую строку с помощью функции first(), но когда я использую get(), я получаю эту ошибку:
Property [id] does not exist on this collection instance.
В api.php у меня есть:
Route::get('investment/{id}', 'InvestmentController@show');
Файл InvestmentResource.php
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class InvestmentResource extends JsonResource
{
public function __construct($resource)
{
parent::__construct($resource);
$this->resource = $resource;
}
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'uuid' => $this->uuid,
'email' => $this->email,
'product_name' => $this->product_name,
'product_price' => $this->product_price,
];
}
public function with($request) {
return [
'status'=> true,
];
}
}
Файл ресурсов JSON для отправки массива
Я подозреваю, что ваша ошибка в InvestmentResource. ->get() вернет коллекцию, но, возможно, ваш InvestmentResource ждет один Item? Публикация кода того, как работает ваш InvestmentResource, может прояснить это.
Я добавил свой файл ресурсов в свой вопрос.
Для этого требуется один ресурс, вы хотите использовать коллекцию ресурсов для преобразования ваших данных.






используйте get() вместо first().
Так:
$cartProduct = add_product_cart::where('uuid', $id)->get();
Также измените следующее, чтобы избежать ошибки, поскольку вы не можете использовать оператор ! для проверки коллекции массивов:
if (count($cartProduct) == 0) {
return new ErrorResource('Data not found');
}
получаю эту ошибку Exception: Property [id] does not exist on this collection instance. in file E:\Xampp\htdocs\logicfinance\vendor\laravel\framework\src\Illuminate\Support\Traits\EnumeratesValues.php on line 860
Можете ли вы отредактировать вопрос и добавить код файла, в котором вы передаете/обрабатываете данные?
У меня есть только контроллер, который использует только метод show(), который я добавил в свой вопрос, и есть файл ресурсов InvestmentResource, который дает полезную нагрузку, как я добавил в вопросе. я вызываю метод с помощью этого API Route::get('investment/{id}', 'InvestmentController@show');, он дает полезную нагрузку, как и ожидалось, с методом first(), но не возвращает то же самое с get(), выдавая вышеуказанную ошибку.
Property [id] does not exist on this collection instance.
Ошибка связана с тем, что метод get() возвращает в ответ массив (коллекцию с индексами).
Таким образом, чтобы получить доступ к id сейчас, вам нужно будет использовать $cartProduct[0]->id цикла для $cartProduct, чтобы получить все ids
Обновлять Вы можете заменить свою функцию следующей.
public function show($id)
{
$cartProduct = add_product_cart::where('uuid', $id)->get();
if (!$cartProduct) {
return new ErrorResource('Data not found');
}
return InvestmentResource::collection($cartProduct);
}
Используйте метод сбора, если в вашей коллекции (данных) существует несколько записей.
можете поделиться фрагментом?
Нужно сначала подтвердить, нужна ли вам одна запись или несколько записей?
несколько записей с одинаковым UUID
Отличный ответ, это помогло, большое спасибо @yasir gakhar
Что такое
InvestmentResource?