PHP code example of devilsberg / laravel-mariadb-vector

1. Go to this page and download the library: Download devilsberg/laravel-mariadb-vector library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

devilsberg / laravel-mariadb-vector example snippets


Schema::create('articles', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->text('body');
    $table->vector('embedding', 768);
    $table->vectorIndex('embedding'); // enables fast ANN search
    $table->timestamps();
});

use Devilsberg\LaravelMariadbVector\Casts\VectorCast;

class Article extends Model
{
    protected function casts(): array
    {
        return [
            'embedding' => VectorCast::class,
        ];
    }
}

$embedding = $yourEmbeddingProvider->embed($article->body); // your code

$article->embedding = $embedding; // float array, e.g. [0.1, 0.2, ...]
$article->save();

use Devilsberg\LaravelMariadbVector\Distance;

$queryVector = $yourEmbeddingProvider->embed('climate change effects');

$results = Article::query()
    ->nearestNeighbors('embedding', $queryVector, Distance::Cosine)
    ->limit(10)
    ->get();

// Each result has a `score` column — higher is more similar (0–1)
foreach ($results as $article) {
    echo $article->title . ' — ' . $article->score;
}

Schema::create('articles', function (Blueprint $table) {
    $table->id();
    $table->vector('embedding', 768);
    $table->vectorIndex('embedding'); // ALTER TABLE ... ADD VECTOR INDEX runs after CREATE TABLE
    $table->timestamps();
});

$table->vectorIndex('embedding');                       // → articles_embedding_vectorindex
$table->vectorIndex('embedding', 'articles_vec_idx');   // → articles_vec_idx (custom)

Schema::table('articles', function (Blueprint $table) {
    $table->vectorIndex('embedding');
});

// Ollama (local)
$response = Http::post('http://localhost:11434/api/embed', [
    'model' => 'nomic-embed-text',
    'input' => $text,
]);
$embedding = $response->json('embeddings.0');

// Mistral
$response = Http::withToken(config('services.mistral.key'))
    ->post('https://api.mistral.ai/v1/embeddings', [
        'model' => 'mistral-embed',
        'input' => [$text],
    ]);
$embedding = $response->json('data.0.embedding');

// Any source — just pass a float array
$article->embedding = $embedding;
$article->save();

protected function casts(): array
{
    return [
        'embedding' => \Devilsberg\LaravelMariadbVector\Casts\VectorCast::class,
    ];
}

$table->vector('embedding', 768)->nullable();

whereVectorSimilarTo(
    string $column,
    array $input,
    float $threshold,       // 

Article::query()->whereVectorSimilarTo('embedding', $queryVector, 0.5)->get();

// Euclidean distance
Article::query()->whereVectorSimilarTo('embedding', $queryVector, 0.5, metric: 'EUCLIDEAN')->get();

orderByVectorDistance(
    string $column,
    array $input,
    ?string $metric = null
)

Article::query()->orderByVectorDistance('embedding', $queryVector)->get();

selectVectorDistance(
    string $column,
    array $input,
    string $as = 'distance',
    ?string $metric = null
)

Article::query()
    ->select('*')
    ->selectVectorDistance('embedding', $queryVector, as: 'score')
    ->orderByVectorDistance('embedding', $queryVector)
    ->get()
    ->each(fn ($article) => dump($article->title, $article->score));

nearestNeighbors(
    string $column,
    array $input,
    Distance $distance = Distance::Cosine
)

use Devilsberg\LaravelMariadbVector\Distance;

Article::query()
    ->nearestNeighbors('embedding', $queryVector, Distance::Cosine)
    ->limit(10)
    ->get();

// With Euclidean distance
Article::query()
    ->nearestNeighbors('embedding', $queryVector, Distance::Euclidean)
    ->limit(5)
    ->get();

$results = Article::query()
    ->select('id', 'title')
    ->whereVectorSimilarTo('embedding', $queryVector, 0.4)
    ->selectVectorDistance('embedding', $queryVector, as: 'score')
    ->orderByVectorDistance('embedding', $queryVector)
    ->limit(10)
    ->get();

return [
    // Default vector dimensions (should match your embedding model output)
    'default_dimensions' => 768,

    // Distance metric: "COSINE" or "EUCLIDEAN"
    'distance_metric' => 'COSINE',
];
sql
SELECT *, 1.0 - (VEC_DISTANCE_COSINE(`embedding`, VEC_FromText(?))) as `score`
FROM `articles`
ORDER BY `score` desc