2016-12-15 49 views
0

我使用PHP作爲後端和MySql數據庫,我有這麼多的一對多關係如何獲取數組從多到許多relatioship

Drivers{ 
id, 
name 
} 

Units{ 
id, 
name 
} 

Driver_Units{ 
id, 
unitId, 
driverId 
} 

當我運行腳本獲得驅動程序詳細反對通過驅動程序ID,我想有像這樣的JSON響應

{ 
firstName: driver_firstName, 
lastName: driver_lastName 
units: [unitObject1, unitObject2, unitObject...] 
} 

所以我想在一個響應中有驅動程序對象和他的單位對象的數組。 我是PHP和MySql的初學者,我希望有人擅長使用此腳本來幫助我,並告訴我是我當前的腳本「很好」,以及如何獲取單元對象數組作爲此響應的一部分,以及通常如何我可以改進這個腳本。

編輯:

我試圖解決方案,我得到了在這個問題的答案,我有這樣的

<?php 
require_once '../../dbConnect.php'; 

$driver_id = '%'; 

if (isset($_GET['driver_id'])) { 
    $driver_id = $_GET['driver_id']; 
} 

$driver_id = 3; //hardcode to test it 

$stmt = $mysqli->prepare(" 
    SELECT d.firstName, d.lastName, u.make, u.model FROM drivers AS d 
    LEFT JOIN drivers_units AS du ON d.driver_id = du.driverId 
    LEFT JOIN units AS u ON u.unit_id = du.unitId 
    WHERE d.driver_id = ?"); 

if($stmt) { 
    $stmt->bind_param("i", $driver_id); 
    $stmt->execute(); 
    $stmt->bind_result($first_name, $last_name, $unit_make, $unit_model); 
    $driver = null; 
    while ($stmt->fetch()) { 
     if (empty($driver)) { // On first row populate all the driver info 
      $driver = array(
       'firstName' => $first_name, 
       'lastName' => $last_name, 
       'units' => array() 
      ); 
     } 
     if ($unit_name) { 
      $driver['units'][] = array(
       'make' => $unit_make, 
       'model' => $unit_model 
      ); 
     } 
    } 

    $mysqli->close(); 
    echo $json_response = json_encode($driver); 
} 

?> 

代碼,但這個代碼返回我一個NULL,所以它就像我不從這個查詢中得到任何東西。

回答

1

加入表格。並學習使用準備好的查詢來替代用戶輸入。

我使用LEFT JOIN所以即使他沒有單位,你也可以得到司機信息。在這種情況下,循環使用if ($unit_name)來跳過LEFT JOIN返回的空單元信息。

$stmt = $mysqli->prepare(" 
    SELECT d.first_name, d.last_name, d.otherAttribute, u.name, u.attr1 FROM Drivers AS d 
    LEFT JOIN Driver_Units AS du ON d.id = du.driverId 
    LEFT JOIN Units AS u ON u.id = du.unitId 
    WHERE d.id = ?"); 
$stmt->bind_param("i", $driver_id); 
$stmt->execute(); 
$stmt->bind_result($first_name, $last_name, $driver_other, $unit_name, $unit_other); 
$driver = null; 
while ($stmt->fetch()) { 
    if (empty($driver)) { // On first row populate all the driver info 
     $driver = array(
      'firstName' => $first_name, 
      'lastName' => $last_name, 
      'otherAttribututes' => $driver_other, 
      'units' => array() 
     ); 
    } 
    if ($unit_name) { 
     $driver['units'][] = array(
      'name' => $unit_name, 
      'otherAttribute' => $unit_other 
     ); 
    } 
} 

要獲取有關所有驅動程序的信息,請使用第一級關閉驅動程序ID的二維數組。

$stmt = $mysqli->prepare(" 
    SELECT d.id, d.first_name, d.last_name, d.otherAttribute, u.name, u.attr1 FROM Drivers AS d 
    LEFT JOIN Driver_Units AS du ON d.id = du.driverId 
    LEFT JOIN Units AS u ON u.id = du.unitId"); 
$stmt->execute(); 
$stmt->bind_result($driver_id, $first_name, $last_name, $driver_other, $unit_name, $unit_other); 
$drivers = array(); 
while ($stmt->fetch()) { 
    if (empty($drivers[$driver_id])) { // On first row populate all the driver info 
     $drivers[$driver_id] = array(
      'firstName' => $first_name, 
      'lastName' => $last_name, 
      'otherAttribututes' => $driver_other, 
      'units' => array() 
     ); 
    } 
    if ($unit_name) { 
     $drivers[$driver_id]['units'][] = array(
      'name' => $unit_name, 
      'otherAttribute' => $unit_other 
     ); 
    } 
} 
+0

我送driver_id使用Ajax POST方法,我會試試這個,並檢查它是否工作正常,謝謝你的快速回答。 –

+0

如果你正在使用POST方法,那麼它應該是'$ _POST ['id']',而不是'$ _GET ['id']' – Barmar

+0

對不起,我使用ajax GET方法,因爲這是獲取驅動程序和腳本的腳本。我使用POST插入腳本。 –

0
<?php 
require_once '../../dbConnect.php'; 

$driver_id = '%'; 

if (isset($_GET['driver_id'])) { 
    $driver_id = $_GET['driver_id']; 
} 

$stmt = $mysqli->prepare(" 
    SELECT d.firstName, d.lastName, u.make, u.model FROM drivers AS d 
    LEFT JOIN drivers_units AS du ON d.driver_id = du.driverId 
    LEFT JOIN units AS u ON u.unit_id = du.unitId 
    WHERE d.driver_id = ?"); 

if($stmt) { 
    $stmt->bind_param("i", $driver_id); 
    $stmt->execute(); 
    $stmt->bind_result($first_name, $last_name, $unit_make, $unit_model); 
    $driver = null; 
    while ($stmt->fetch()) { 
     if (empty($driver)) { // On first row populate all the driver info 
      $driver = array(
       'firstName' => $first_name, 
       'lastName' => $last_name, 
       'units' => array() 
      ); 
     } 
     if ($unit_make) { 
      $driver['units'][] = array(
       'make' => $unit_make, 
       'model' => $unit_model 
      ); 
     } 
    } 
    $stmt->close(); 
    $mysqli->close(); 
    echo $json_response = json_encode($driver); 
} 

?> 

在這條路上我得到driverId驅動程序的細節,我送過來AJAX請求,對象是這樣的:

{ 
firstName: John, 
lastName: Doe 
units:[unitObject1, unitObject2....] 
}