2017-02-01 3 views
1

у меня есть этот запрос в моей модели в CodeIgniter:запрос возвращает строки, которые не существуют

function get_licenses_info($id) 
    { 
     $this->db->select(' 
      vendors.id as vendors_id, 
      vendor_licenses.id as vendor_licenses_id, 
      vendor_licenses.vendor_id, 
      vendor_licenses.license_type, 
      vendor_licenses.date_expires, 
      vendor_licenses.license_num 
      '); 
     $this->db->from('vendors'); 
     $this->db->join('vendor_licenses', 'vendor_licenses.vendor_id = vendors.id', 'left'); 
     $query = $this->db->get(); 
     return $query->result_array(); 
    } 

И этот кусок кода, на мой взгляд:

foreach($licenses as $l) 
{ 
    echo $l['license_type']; 
    if(strtotime($l['date_expires']) < time()) 
     { 
      echo " expired on ".date("M, d, Y", strtotime($l['date_expires']))."<br>"; 
     } 
    else 
    { 
     echo "<br>"; 
    } 
} 

и это то, что получает возвращается на вид:

Baldwin County 
City of Pensacola expired on Jan, 04, 2017 
expired on Dec, 31, 1969 

Я думал, что, возможно, я каким-то образом получил дополнительный ряд в своей БД. Но я проверил, и я записал только две записи. Поэтому я подумал, что, возможно, таблица была повреждена, удалила ее и сделала новую копию с двумя новыми записями ... той же самой проблемой. Даже более странно, когда я удалил все записи, у меня не было ни одной, но и двух «пустых» итераций. Я искал это широко и не могу найти что-нибудь на этом, а не на поиск проблемы с CodeIgniter или даже на общую работу mySQL. Любой совет будет принят во внимание.

Вот vendor_licenses стол:

╔════════════════════════════════════════════════════╦══╗ 
║             ║ ║ 
╠════════════════════════════════════════════════════╬══╣ 
║ id vendor_id license_type date_expires license_num ║ ║ 
║ 1 2 Baldwin County 2017-02-03 NULL     ║ ║ 
║ 2 2 City of Pensacola 2017-01-04 NULL    ║ ║ 
╚════════════════════════════════════════════════════╩══╝ 

и вот вендоры стол:

+--------------+ 
| id is_active | 
+--------------+ 
| 1 1   | 
| 2 1   | 
+--------------+ 
+0

Таким образом, проблема в том, что вы ничего не ожидая, что вернулся? – Wold

+0

Я ожидаю, что строки в базе данных, которые существуют для возврата, они есть, но строка, которая не существует, возвращается в конце! Я подозреваю, что это как-то связано с моей петлей foreach .... это цикл по крайней мере 1 слишком много раз .... – huzzah

+0

это похоже на проблему со вступлением. Не могли бы вы включить все записи в «vendors» и «vendor_licenses»? – Wold

ответ

2

Reverse инфу.

Вы делаете:

SELECT fields FROM vendors 
LEFT JOIN vendor_licenses ON vendor_licenses.vendor_id = vendors.id 

Таким образом, вы получите строку для каждой записи таблицы поставщиков. Но я полагаю, вы не заинтересованы в получении чего-либо для id = 1 поставщика, у которого нет информации в таблице vendor_licenses (вы получаете не полностью информированную строку).

Вместо этого попробуйте:

SELECT fields FROM vendor_licenses 
LEFT JOIN vendors ON vendor_licenses.vendor_id = vendors.id 

..so, что вы получите строку для каждого vendor_license записи.

Или просто держать его как есть, но не ЛЕВЫЙ но RIGHT JOIN таблицы:

$this->db->join('vendor_licenses', 'vendor_licenses.vendor_id = vendors.id', 'right'); 
+0

Хорошо, это действительно сработало, но, возможно, вы можете объяснить мне, что представляет собой не полностью информированная строка? Запрос определенно выполняется vendor.id = 2, поэтому я немного потерял, почему было реверсировано соединение. – huzzah

+0

О, сделав «правильное» соединение, это имело смысл для меня. СПАСИБО! – huzzah

Смежные вопросы