DE Deutsch
Version: v2.3.0

select

Daten aus einer Tabelle abrufen.

select($table, $columns)
select($table, $columns, $where)
select($table, $join, $columns, $where)
Rückgabewert
[array] Ein Array, das die abgerufenen Zeilen enthält.
Sie können im Parameter columns * verwenden, um alle Spalten abzurufen. Aus Gründen der Performance und Lesbarkeit empfiehlt es sich jedoch, nur die tatsächlich benötigten Spalten explizit anzugeben.
$data = $database->select("account", [
	"user_name",
	"email"
], [
	"user_id[>]" => 100
]);

// Beispielergebnis:
// array(
//  [0] => array(
//	  "user_name" => "foo",
//	  "email" => "foo@bar.com"
//  ),
//  [1] => array(
//	  "user_name" => "cat",
//	  "email" => "cat@dog.com"
//  )
// )

foreach ($data as $item) {
	echo "Benutzer: " . $item["user_name"] . " - E-Mail: " . $item["email"] . "<br/>";
}

// Alle Spalten auswählen.
$data = $database->select("account", "*");

// Eine einzelne Spalte auswählen.
$data = $database->select("account", "user_name");

// Beispielergebnis:
// array(
//  [0] => "foo",
//  [1] => "cat"
// )

Zeilen per Callback verarbeiten

Standardmäßig lädt select() den vollständigen Ergebnissatz in den Speicher und gibt ihn als Array zurück.
Beim Abrufen einer großen Anzahl von Zeilen kann dies die Speichernutzung erheblich erhöhen. Wenn Sie einen Rückruf wie function ($data) {} als letztes Argument an select() übergeben, ruft Medoo jede Zeile sofort ab und verarbeitet sie, anstatt zuerst die gesamte Ergebnismenge im Speicher zu speichern.
Dieser Ansatz ist bei der Arbeit mit großen Datensätzen speichereffizienter.
$database->select("account", ["name"], function ($data) {
	echo $data["name"];
});

$database->select("account", [
	"name"
], function ($data) {
	echo $data["name"];
});
Leistungsbenchmark
Das folgende Beispiel vergleicht die Speichernutzung beim Abrufen und Ausgeben von 1.000, 5.000 und 20.000 Zeilen aus einer MySQL Datenbank. Die Speichernutzung wird mit memory_get_usage() gemessen.
// Methode 1
$database->select("account", ["name"], function ($data) {
	echo $data["name"];
});

// Zum Vergleich:

// Methode 2
$data = $database->select("account", ["name"]);

foreach ($data as $item) {
	echo $item["name"];
}
Methode 1 Methode 2
1.000 Datensätze 789 KB 1,2 MB
5.000 Datensätze 1,1 MB 3,3 MB
20.000 Datensätze 2,26 MB 11,1 MB

Tabellen-Joins

SQL JOIN-Klauseln kombinieren Zeilen aus mehreren Tabellen. Medoo bietet eine einfache Syntax zum Erstellen von Joins.
$database->select("post", [
	// Definiert die Beziehung zwischen der Haupttabelle und der verknüpften Tabelle.
	"[>]account" => ["author_id" => "user_id"]
], [
	"post.title",
	"account.city"
]);
Die Spalte author_id in der Tabelle post stimmt mit der Spalte user_id in der Tabelle account überein.
"[>]account" => ["author_id" => "user_id"]
LEFT JOIN "account" ON "post"."author_id" = "account"."user_id"
Wenn beide Tabellen denselben Spaltennamen verwenden, können Sie die Kurzform verwenden.
"[>]album" => "user_id"
LEFT JOIN "album" USING ("user_id")
Wenn mehrere Spalten in beiden Tabellen denselben Namen haben, können Sie sie als Array übergeben.
"[>]photo" => ["user_id", "avatar_id"]
LEFT JOIN "photo" USING ("user_id", "avatar_id")
Wenn Sie dieselbe Tabelle mehr als einmal verknüpfen müssen, weisen Sie der verknüpften Tabelle einen Alias ​​zu.
"[>]account (replier)" => ["replier_id" => "user_id"]
LEFT JOIN "account" AS "replier" ON "post"."replier_id" = "replier"."user_id"
Sie können auch auf eine zuvor verknüpfte Tabelle verweisen, indem Sie der Spalte den Tabellennamen voranstellen.
"[>]account" => ["author_id" => "user_id"],
"[>]album" => ["account.user_id" => "user_id"]
LEFT JOIN "account" ON "post"."author_id" = "account"."user_id"
LEFT JOIN "album" ON "account"."user_id" = "album"."user_id"
Mehrere JOIN-Bedingungen
"[>]account" => [
	"author_id" => "user_id",
	"album.user_id" => "user_id"
]
LEFT JOIN "account" ON
"post"."author_id" = "account"."user_id" AND
"album"."user_id" = "account"."user_id"
Zusätzliche JOIN-Bedingungen
Sie können der Join-Klausel auch logische Bedingungen hinzufügen.
"[>]comment" => [
	"author_id" => "user_id",
	"AND" => [
		"rate[>]" => 50
	]
]
LEFT JOIN "comment" ON "post"."author_id" = "comment"."user_id" AND "rate" > 50
JOIN mit einem Raw-Objekt
"[>]account" => Medoo::raw("ON <post.author_id> = <account.user_id>")
LEFT JOIN "account" ON "post"."author_id" = "account"."user_id"

Datenzuordnung

Sie können die Struktur der zurückgegebenen Daten anpassen. Der Zuordnungsschlüssel muss nicht mit dem ursprünglichen Spaltennamen übereinstimmen und eine verschachtelte Ausgabe wird unterstützt.
$data = $database->select("post", [
	"[>]account" => ["user_id"]
], [
	"post.content",

	"userData" => [
		"account.user_id",
		"account.email",

		"meta" => [
			"account.location",
			"account.gender"
		]
	]
], [
	"LIMIT" => [0, 2]
]);

echo json_encode($data);
[
	{
		"content": "Hello world!",
		"userData": {
			"user_id": "1",
			"email": "foo@example.com",
			"meta": {
				"location": "New York",
				"gender": "male"
			}
		}
	},
	{
		"content": "Hey everyone",
		"userData": {
			"user_id": "2",
			"email": "bar@example.com",
			"meta": {
				"location": "London",
				"gender": "female"
			}
		}
	}
]

Indexzuordnung

Wenn Sie einen Spaltennamen als ersten Schlüssel in der Spaltendefinition verwenden, wird das Ergebnis von dieser Spalte indiziert.
$data = $database->select("post", [
	"user_id" => [
		"nickname",
		"location",
		"email"
	]
]);
{
	"10": {
		"nickname": "foo",
		"location": "New York",
		"email": "foo@example.com"
	},
	"12": {
		"nickname": "bar",
		"location": "New York",
		"email": "bar@medoo.in"
	}
}

Datentypdeklarationen

Sie können den Ausgabetyp für ausgewählte Felder explizit deklarieren.
// Unterstuetzte Datentypen: [String | Bool | Int | Number | Object | JSON]
// [String] is the default type for all output values.
// [Object] represents PHP data serialized with serialize() and decoded with unserialize().
// [JSON] represents valid JSON data and will be decoded with json_decode().

$data = $database->select("post", [
	"[>]account" => ["user_id"]
], [
	"post.post_id",

	"profile" => [
		"account.age [Int]",
		"account.is_locked [Bool]",
		"account.userData [JSON]"
	]
]);

echo json_encode($data);
[
	{
		"post_id": "1",
		"profile": {
			"age": 20,
			"is_locked": true,
			"userData": ["foo", "bar", "tim"]
		}
	},
	{
		"post_id": "2",
		"profile": {
			"age": 25,
			"is_locked": false,
			"userData": ["mydata1", "mydata2"]
		}
	}
]
// Speichert ein Objekt in der Datenbank und ruft es spaeter wieder ab.
class Foo {
	var $bar = "cat";

	public function __wakeup()
	{
		$this->bar = "dog";
	}
}

$object_data = new Foo();

$database->insert("account", [
	"data" => $object_data
]);

$data = $database->select("account", [
	"data [Object]"
]);

echo $data[0]["data"]->bar;

// Die __wakeup()-Methode des Objekts wird waehrend unserialize() aufgerufen.
// Daher lautet die Ausgabe "dog".

Aliase

Sie können einem Spalten- oder Tabellennamen einen Alias ​​zuweisen. Dies ist besonders bei verknüpften Abfragen nützlich, um Namenskonflikte zu vermeiden oder die Ausgabe klarer zu gestalten.
$data = $database->select("account", [
	"user_id",
	"nickname (my_nickname)"
]);

// Beispielergebnis:
// array(
//  [0] => array(
//	  "user_id" => "1",
//	  "my_nickname" => "foo"
//  ),
//  [1] => array(
//	  "user_id" => "2",
//	  "my_nickname" => "bar"
//  )
// )

$data = $database->select("post (content)", [
	"[>]account (user)" => "user_id",
], [
	"content.user_id (author_id)",
	"user.user_id"
]);

// Beispielergebnis:
// array(
//  [0] => array(
//	  "author_id" => "1",
//	  "user_id" => "321"
//  ),
//  [1] => array(
//	  "author_id" => "2",
//	  "user_id" => "322"
//  )
// )
SELECT
	"content"."user_id" AS "author_id",
	"user"."user_id"
FROM
	"post" AS "content"
LEFT JOIN "account" AS "user" USING ("user_id")

DISTINCT

Um das Schlüsselwort DISTINCT zu einer ausgewählten Spalte hinzuzufügen, stellen Sie dem Spaltennamen @ voran.
$data = $database->select("account", [
	// Auf diese Spalte wird DISTINCT angewendet.
	"@location",
	
	"id",
	"name",
]);
SELECT DISTINCT "location", "id", "name"
FROM "account"
Um unterschiedliche Werte zu zählen, verwenden Sie einen Rohausdruck.
$data = $database->select("account", [
	"unique_locations" => Medoo::raw("COUNT(DISTINCT <location>)")
]);
SELECT COUNT(DISTINCT "location") AS "unique_locations"
FROM "account"