#laravel #xamarin #xamarin.forms
#laravel #xamarin #xamarin.forms
Вопрос:
Я использую Laravel 7.0 для серверной части моих приложений Xamarin. До тех пор, пока я не обновил xamarin.forms, он работал нормально. Теперь я не могу показать продукты в категории. вот как я получаю продукты
$products = Product::select("products.*",DB::raw("COALESCE(cart.quantity,0) as cart_quantity"),DB::raw("COALESCE(cart.id,0) as cart_id"),DB::raw("(0) as SecondLoad"),DB::raw("(0) as checkPickerLoad"),DB::raw("IF ((select count(favourite_products.product_id) from favourite_products where favourite_products.product_id = products.id and favourite_products.user_id='$user_id' and favourite_products.status='AC') > 0,'Favourites_selected.png','Favourites.png') as favourite"),DB::raw("(select product_variations.price from product_variations where product_variations.product_id = products.id and product_variations.status='AC' limit 1) as price"),DB::raw("(select product_variations.special_price from product_variations where product_variations.product_id = products.id and product_variations.status='AC' limit 1) as special_price"),DB::raw("(select round((product_variations.price - product_variations.special_price)*100 / product_variations.price) from product_variations where product_variations.product_id = products.id and product_variations.status='AC' limit 1) as discount"))->join('product_variations', 'product_variations.product_id', '=', 'products.id')->leftJoin("cart", function ($join) use ($user_id) {
$join->on("cart.product_id", "=", "products.id");
$join->where(["cart.user_id" => $user_id, "cart.status" => "AC"]);
})->with(['get_product_variations' => function ($q) {
$q->with(['product_units' => function ($q) {
$q->select('id', 'name', 'h_name');
}])->where('status', 'AC');
}, 'product_brand' => function ($query) {
$query->select('id', 'name as brand_name');
}])
->where(['products.status' => 'AC', 'category_id' => $request->category_id, 'product_variations.status' => 'AC'])
->groupBy('products.id')
->orderBy('products.name')
->get();
это формат, который я получаю.
{
"status": 200,
"message": "OK",
"data": [{
"id": 180,
"name": "Blueberry Juice",
"category_id": 6,
"description": "Juice","image":"http://127.0.0.1:8000/uploads/products/5f150c6847a77_Wild-Blueberry-Juice.jpg","is_featured":0,"is_quick_grab":0,"is_offered":0,"status":"AC","brand_id":1,"h_name":null,"h_description":null,"price":"2.00","quantity":0,"cgst":"0.00","sgst":"0.00","igst":"0.00","created_at":"2020-08-15T11:35:27.000000Z","updated_at":"2020-08-15T11:35:27.000000Z","cart_quantity":0,"cart_id":0,"SecondLoad":0,"checkPickerLoad":0,"favourite":"Favourites.png","special_price":"1.00","discount":"50","get_product_variations":[{"id":7,"product_id":180,"unit_id":6,"weight":1,"price":"2.00","special_price":"1.00","status":"AC","created_at":"2020-07-20T03:16:01.000000Z","updated_at":"2020-07-20T03:16:01.000000Z","product_units":{"id":6,"name":"Each","h_name":""}}],"product_brand":{"id":1,"brand_name":"Local"}}]}
К сожалению, на странице сейчас не отображаются какие-либо данные… Если я изменю код на этот
$products = Product::join('product_variations', 'product_variations.product_id', '=', 'products.id')->leftJoin("cart", function ($join) use ($user_id) {
$join->on("cart.product_id", "=", "products.id");
$join->where(["cart.user_id" => $user_id, "cart.status" => "AC"]);
})->with(['get_product_variations' => function ($q) {
$q->with(['product_units' => function ($q) {
$q->select('id', 'name', 'h_name');
}])->where('status', 'AC');
}, 'product_brand' => function ($query) {
$query->select('id', 'name as brand_name');
}])
->where(['products.status' => 'AC', 'category_id' => $request->category_id, 'product_variations.status' => 'AC'])
->groupBy('products.id')
->orderBy('products.name')
->get();
что означает удаление select («***»), после чего он снова работает, конечно, с большим количеством недостающей информации. Я работал над этим последние 4 дня. Я искал везде, во всех группах xamarin и т.д.. Ни за что.. все это произошло после обновления xamarin.forms до последней версии. по какой-то причине, когда я отправляю данные с помощью select, они не могут их обработать..
Я также добавляю свою логику продукта. Проблема связана с задачами Product, ProductDetail и SearchProduct.
public class ProductLogic
{
public static async Task<ProductResponce> GetProducts(int CategoryId, string UserId)
{
ProductResponce productResponce;
using (HttpClient httpClient = new HttpClient(new NativeMessageHandler()))
{
var url = string.Format(Config.GetProductList, CategoryId, UserId);
var response = await httpClient.GetAsync(url);
var json = await response.Content.ReadAsStringAsync();
productResponce = JsonConvert.DeserializeObject<ProductResponce>(json);
}
return productResponce;
}
public static async Task<ProductDetailResponce> GetProduct(int ProductId)
{
ProductDetailResponce product = new ProductDetailResponce();
using (HttpClient httpClient = new HttpClient(new NativeMessageHandler()))
{
var url = string.Format(Config.GetSingleProduct, ProductId);
var response = await httpClient.GetAsync(url);
var json = await response.Content.ReadAsStringAsync();
var productDetail = JsonConvert.DeserializeObject<ProductDetailResponce>(json);
product = productDetail;
}
return product;
}
public static async Task<SearchProductResponce> GetSearchProducts(string text, string UserId)
{
SearchProductResponce productResponce;
using (HttpClient httpClient = new HttpClient(new NativeMessageHandler()))
{
var url = string.Format(Config.GetSearchProductList, text, UserId);
var response = await httpClient.GetAsync(url);
var json = await response.Content.ReadAsStringAsync();
productResponce = JsonConvert.DeserializeObject<SearchProductResponce>(json);
}
return productResponce;
}
public static async Task<FavouriteProductResponce> AddFavouriteProduct(Dictionary<string, int> data)
{
FavouriteProductResponce favouriteProduct;
using (HttpClient httpClient = new HttpClient(new NativeMessageHandler()))
{
var jsonData = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync(Config.AddFavourite, jsonData);
var json = await response.Content.ReadAsStringAsync();
favouriteProduct = JsonConvert.DeserializeObject<FavouriteProductResponce>(json);
}
return favouriteProduct;
}
public static async Task<FavouriteProductListResponse> GetFavouriteProducts(int user_id)
{
FavouriteProductListResponse favouriteProduct;
using (HttpClient httpClient = new HttpClient(new NativeMessageHandler()))
{
var url = string.Format(Config.GetFavouriteProducts, user_id);
var response = await httpClient.GetAsync(url);
var json = await response.Content.ReadAsStringAsync();
favouriteProduct = JsonConvert.DeserializeObject<FavouriteProductListResponse>(json);
}
return favouriteProduct;
}
public static async Task<DeleteFavouriteProductResponce> DeleteFavouriteProduct(Dictionary<string, string> data)
{
DeleteFavouriteProductResponce deleteFavouriteProduct;
using (HttpClient httpClient = new HttpClient(new NativeMessageHandler()))
{
var jsonData = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync(Config.DeleteFavourite, jsonData);
var json = await response.Content.ReadAsStringAsync();
deleteFavouriteProduct = JsonConvert.DeserializeObject<DeleteFavouriteProductResponce>(json);
}
return deleteFavouriteProduct;
}
}
Комментарии:
1. Где ваш код Xamarin, который вызывает веб-сервис и десериализует данные? Если ваш формат json не изменился, маловероятно, что обновление Forms приведет к нарушению кода, но, не видя его, невозможно сказать наверняка.
2. Ваши различные вызовы
DeserializeObject
все еще работают правильно? Это многоступенчатый процесс (запрашивает данные, php отвечает на запрос, десериализует, привязывает к пользовательскому интерфейсу и т.д.), И вам нужно начать с определения того, какой шаг вызывает проблему.3. в этом фрагменте кода favorite, favoriteProductList и deleteFavouriteProduct работают нормально.. если я изменю код api, то код будет работать нормально (со всеми отсутствующими полями, которые я удаляю из api)..
4. Вы не отвечаете на мой вопрос. Для методов, которые «не работают», вам нужно определить, где они выходят из строя. Вам нужно пошагово просмотреть код в отладчике и определить, в какой конкретный момент они перестают работать.