Maison  >  Questions et réponses  >  le corps du texte

TP5.1 Implémenter la fonction de recherche dans une requête associée à plusieurs tables

Problèmes avec la fonction de recherche associée multi-tables :

Le code est le suivant :

// 实现搜索功能
$productName = Request::param('productName');
$storeName = Request::param('storeName');

if ( !empty($productName) && empty($storeName) ) {
    $map[] = ['p.name', 'like', '%' . $productName . '%'];
} else if ( !empty($storeName) && empty($productName) ) {
    $map[] = ['s.name', 'like', '%' . $storeName . '%'];
} else if ( !empty($productName) && !empty($storeName) ) {
    $map[] = ['p.name', 'like', '%' . $productName . '%'];
    $map[] = ['s.name', 'like', '%' . $storeName . '%'];
}

// 定义分页参数
$limit = isset($_GET['limit']) ? $_GET['limit'] : 10;
$page = isset($_GET['page']) ? $_GET['page'] : 1;

$stockList = StockModel::where($map)
    -> alias('sk')
    -> leftJoin('product p', 'sk.product_id = p.id')
    -> join('store s', 'sk.store_id = s.id')
    -> where('sk.status', 1)
    -> order('sk.product_id', 'desc')
    -> field('sk.*, p.name as product_name, s.name as store_name')
    -> page($page, $limit)
    -> select();

1 Dans le code ci-dessus, nous souhaitons implémenter la fonction de recherche, mais dans la condition $map, car la recherche porte sur le. champs de la table attachée ajoutés via la jointure, utilisez donc l'alias de la table attachée. La forme du champ, telle que : p.name, s.name, il y a un problème avec la recherche dans l'instruction SQL générée. les tables attachées sont filtrées, comme suit :

01.jpg

02.jpg

comme ceci Par conséquent, la table attachée a disparu, il est donc erroné d'ajouter des alias aux champs.

2. Modifiez les conditions de recherche sous la forme nom de table.field De cette façon, il n'y a aucun problème pour rechercher les champs de la table principale, mais il y a toujours un problème dans la recherche dans la table annexe. généré de cette manière, le tableau en annexe est conservé, mais la recherche Il y a toujours un problème, l'erreur est la suivante :

04.jpg

03.jpg

Quelqu'un peut-il m'aider, comment faire ? ? ?

JackieJackie1609 Il y a quelques jours1875

répondre à tous(4)je répondrai

  • WJ

    WJ2020-06-17 16:40:17

    Il semble que ce que vous avez écrit soit de vérifier les données dans deux tables liées. Utilisez-vous parma pour accepter deux valeurs ?

    Vous pouvez le faire, recevoir une seule valeur $where

    $map[] = ['p.name | s.name', 'like', '%' . $productName . '%'];

    puis utiliser la requête de lien, plus le groupe "gruop", essayez-le !

    Je ne sais pas si ce que j'ai dit est vrai

    répondre
    0
  • Jackie

    Cela ne fonctionne pas non plus, il affiche toujours : SQLSTATE[42S22] : Colonne introuvable : 1054 Colonne inconnue 'p.name' dans 'clause Where' L'instruction SQL générée est la suivante : SELECT * FROM `sr_stock` OÙ ( `p`.`name` LIKE '%Helen Keller%' OU `s`.`name` LIKE '%Helen Keller%' )

    Jackie · 2020-06-17 20:35:14
    WJ

    Le produit est-il le nom complet de la table ?

    WJ · 2020-06-18 11:28:59
    Jackie

    Non, le préfixe de mon nom de table est : sr_

    Jackie · 2020-06-18 23:50:33
  • Annulerrépondre