1. Go to this page and download the library: Download socialdept/atp-orm 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/ */
socialdept / atp-orm example snippets
use App\Remote\Post;
// List a user's posts
$posts = Post::for('alice.bsky.social')->limit(10)->get();
foreach ($posts as $post) {
echo $post->text;
echo $post->createdAt;
}
// Paginate through all posts
while ($posts->hasMorePages()) {
$posts = $posts->nextPage();
}
// Find a specific post
$post = Post::for('did:plc:ewvi7nxzyoun6zhxrhs64oiz')->find('3mdtrzs7kts2p');
echo $post->text;
// Find by AT-URI
$post = Post::for('alice.bsky.social')
->findByUri('at://did:plc:ewvi7nxzyoun6zhxrhs64oiz/app.bsky.feed.post/3mdtrzs7kts2p');
namespace App\Remote;
use SocialDept\AtpOrm\RemoteRecord;
use SocialDept\AtpSchema\Generated\App\Bsky\Feed\Post as PostData;
class Post extends RemoteRecord
{
protected string $collection = 'app.bsky.feed.post';
protected string $recordClass = PostData::class;
protected int $cacheTtl = 300;
}
use App\Remote\Post;
// Basic listing
$posts = Post::for('alice.bsky.social')->get();
// With options
$posts = Post::for('did:plc:ewvi7nxzyoun6zhxrhs64oiz')
->limit(25)
->reverse()
->get();
// By record key
$post = Post::for('alice.bsky.social')->find('3mdtrzs7kts2p');
// Throws RecordNotFoundException if not found
$post = Post::for('alice.bsky.social')->findOrFail('3mdtrzs7kts2p');
// By full AT-URI
$post = Post::for('alice.bsky.social')
->findByUri('at://did:plc:ewvi7nxzyoun6zhxrhs64oiz/app.bsky.feed.post/3mdtrzs7kts2p');
$posts = Post::for($did)->limit(50)->get();
echo $posts->cursor(); // Pagination cursor
while ($posts->hasMorePages()) {
$posts = $posts->nextPage();
foreach ($posts as $post) {
// Process each page...
}
}
// Use model's default TTL
$posts = Post::for($did)->get();
// Custom TTL for this query (seconds)
$posts = Post::for($did)->remember(600)->get();
// Bypass cache entirely
$posts = Post::for($did)->fresh()->get();
// Reload a single record from remote
$post = $post->fresh();
// Invalidate all cached data for a scope
Post::for($did)->invalidate();
$post = Post::for('did:plc:abc')->find('rk1');
// Get all likes on this post
$likes = $post->backlinks()->likes();
echo $likes->total(); // 2852
echo $likes->count(); // Items in this page
foreach ($likes as $ref) {
echo $ref->did; // Who liked it
echo $ref->uri(); // at://did/app.bsky.feed.like/rkey
}
// Find all records in a custom collection that link to this post
$backlinks = $post->backlinks()
->source('com.example.bookmark', 'post.uri')
->limit(50)
->reverse()
->get();
use SocialDept\AtpOrm\Backlinks\BacklinkQuery;
// Find followers of a DID
$followers = BacklinkQuery::for('did:plc:abc')
->source('app.bsky.graph.follow', 'subject')
->get();
// Get a count
$likeCount = BacklinkQuery::for('at://did:plc:abc/app.bsky.feed.post/rk1')
->source('app.bsky.feed.like', 'subject.uri')
->count();
$likes = $post->backlinks()->likes();
while ($likes->hasMorePages()) {
$likes = $likes->nextPage();
}
$hydrated = $post->backlinks()
->source('app.bsky.feed.like', 'subject.uri')
->hydrate(Like::class);
// Returns RemoteCollection of Like instances
foreach ($hydrated as $like) {
echo $like->subject; // Full record data
}
$likes = $post->backlinks()->likes();
$likes->uris(); // Collection of AT-URIs
$likes->dids(); // Collection of unique DIDs
$likes->toArray(); // Array of {did, collection, rkey, uri}
$likes->filter(fn ($ref) => $ref->did === 'did:plc:abc');