Es porque vas reemplazando el valor de $num una y otra vez en el bucle, por lo cual solo tomara el valor del ultimo valor que regresa la consulta.
Tambien no hay porque usar comillas dobles:
$num = $datos['cajas'];
Si quieres ir guardando cada caja en un array, tienes que hacer:
$num[] = $datos['cajas'];