2017-10-12 1 views
6

fonction contrôleur:Comment extraire une image unique à partir d'un tableau d'images insérées dans laravel?

<?php 

public function addImages(Request $request, $imagesProductId) { 

    $product = Product::create($request->all()); 
    $filenames = array(); 

    if (empty($request->images)) { 
     $message = "error"; 
     return Redirect::back()->with('message', $message); 
    } 


    $rules = [ 
     'images' => 'mimes:jpeg,jpg,png'     // allowed MIMEs 
// size in pixels 
    ]; 



    $validator = Validator::make($request->all(), $rules); 
    $result = $validator->fails() ? 'QCVerified' : 'QCFailed'; 



    foreach ($request->images as $photo) { 

// echo($result); 
     $filename = $photo->store('public/uploadedImages'); 
     $filename = substr($filename, 22); 
     $filenames[] = asset('storage/uploadedImages/' . $filename); 
     ProductsPhoto::create([ 
      'nonliveStatus' => $result, 
      'product_id' => $product->id, 
      'productId' => $imagesProductId, 
      'filename' => $filename 
     ]); 
    } 
    return response()->json($filenames); 
} 
?> 

Ceci est ma fonction de stockage pour stocker ensemble d'images.

Fonction Pour récupérer une seule image à partir d'une série d'images:

<?php 
$liveValues = priceInfo::join('productDescription', 'productDescription.productId', '=', 'productPriceDetails.productId') 
     ->join('productAdditionalInformation', 'productAdditionalInformation.productId', '=', 'productPriceDetails.productId') 
     ->join('products_photos', 'products_photos.productId', '=', 'productAdditionalInformation.productId') 
     ->select('products_phots.filename') 
     ->where('productPriceDetails.nonliveStatus', '=', "QCVerified") 
     ->get(); 
?> 

Ici, je choisissais le imagefile du table.It va chercher les images multiples basées sur id.But CONSERVE simple je besoin d'un seul images provenant du tableau d'images stockées.

+1

utilisez limite dans votre requête pour obtenir l'image unique – pravindot17

+0

veuillez s'il vous plaît spécifier clairement –

+0

Je suggère d'utiliser '-> groupBy ('productPriceDetails.productId')' comme une solution. mais le problème principal est dans votre conception de base de données –

Répondre

1

Utilisez le code ci-dessous les enregistrements limités

<?php 
$liveValues = priceInfo::join('productDescription', 'productDescription.productId', '=', 'productPriceDetails.productId') 
     ->join('productAdditionalInformation', 'productAdditionalInformation.productId', '=', 'productPriceDetails.productId') 
     ->join('products_photos', 'products_photos.productId', '=', 'productAdditionalInformation.productId') 
     ->select('products_phots.filename') 
     ->where('productPriceDetails.nonliveStatus', '=', "QCVerified") 
     ->limit(1) 
     ->get(); 
    ?> 

de contrôle du code ci-dessous mis à jour: Vous regrouperons les images de produits et va obtenir l'image produit unique

<?php 
$liveValues = priceInfo::join('productDescription', 'productDescription.productId', '=', 'productPriceDetails.productId') 
    ->join('productAdditionalInformation', 'productAdditionalInformation.productId', '=', 'productPriceDetails.productId') 
    ->join('products_photos', 'products_photos.productId', '=', 'productAdditionalInformation.productId') 
    ->select('products_phots.filename') 
    ->where('productPriceDetails.nonliveStatus', '=', "QCVerified") 
    ->limit(1) 
    ->groupBy('products_photos.productId') 
    ->get(); 
?> 
+0

Désolé, je ne veux pas limiter les enregistrements.Je veux juste limiter les images que je vais chercher –

+0

quelqu'un ?? Aidez-moi à résoudre ce problème –

+0

'SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1055 L'expression # 1 de la liste SELECT n'est pas dans la clause GROUP BY et contient une colonne non agrégée 'GemSeller.products_photos.filename' qui ne dépend pas de la fonction colonnes dans la clause GROUP BY; Ceci est incompatible avec sql_mode = only_full_group_by' –

1
<?php 
$liveValues = priceInfo::join('productDescription', 'productDescription.productId', '=', 'productPriceDetails.productId') 
     ->join('productAdditionalInformation', 'productAdditionalInformation.productId', '=', 'productPriceDetails.productId') 
     ->join('products_photos', 'products_photos.productId', '=', 'productAdditionalInformation.productId') 
     ->select('products_phots.filename') 
     ->where('productPriceDetails.nonliveStatus', '=', "QCVerified") 
     ->get(); 
?> 

Dans ce code, utilisez first() au lieu de get().

+0

Ici aussi, il limite les enregistrements que je vais chercher –

+0

quelqu'un ?? ............... –

2

Votre requête de base de données actuelle répertorie simplement tous les noms de fichiers possibles car aucune restriction d'ID n'est ajoutée. Étant donné que l'OP indique que vous souhaitez rechercher un nom de fichier basé sur un ID unique et que vos commentaires sur d'autres réponses indiquent que vous ne souhaitez pas limiter les enregistrements extraits, vous pouvez étendre votre requête pour inclure un ID et Ensuite, effectuez une recherche dans la collection résultante:

// I've included the "productId" column here, but feel free to include any other column as required. 
$liveValues = priceInfo::join('productDescription',  'productDescription.productId', '=', 'productPriceDetails.productId') 
         ->join('productAdditionalInformation',  'productAdditionalInformation.productId', '=', 'productPriceDetails.productId') 
         ->join('products_photos', 'products_photos.productId', '=',  'productAdditionalInformation.productId') 
         ->select('products_photos.productId', 'products_photos.filename') 
         ->where('productPriceDetails.nonliveStatus', '=', "QCVerified") 
         ->get(); 

// Get the image filename for a given productId. 
// ID calculation logic here. 
$productId = 512; // Sample ID 

// $liveValues is a Collection. 
$filename = $liveValues->where('productId', $productId) 
         ->pluck('filename') 
         ->first(); // Get first filename if there are multiple. 

Bien sûr, ceci n'est qu'un exemple de la façon de résoudre ce problème. Vous aurez certainement besoin de l'ajuster pour l'adapter au reste de votre code.

1

Si vous comprenez bien, alors vous avez beaucoup de photos de produits. Si vous avez une photo dans la base de données est une photo principale, vous pouvez construire une requête comme:

SELECT ... FROM ... 
    [LEFT] JOIN products_photos 
     ON products_photos.productId = productAdditionalInformation.productId 
      AND products_photos.is_main = 1 

Sinon, utilisez la sous-requête

SELECT ... , (SELECT filename FROM products_photos WHERE productId = productAdditionalInformation.productId [ORDER BY productId DESC]) 
    FROM ... 

Désolé pour l'utilisation de la notation SQL, mais je Je ne connais pas la requête-bulder lawrell. Et c'est juste un problème typique avec la construction de requêtes SQL.