# Sql Recursive Loop Check

## SqlRecursiveCheckTask

`SqlRecursiveCheckTask` helps you find **loops** in data where one item points to another — for example, parent-child or dependency relationships.

It checks for **cycles**, like when A → B → C → A. These can break trees, graphs, or dependency systems.

---

### What You Give It

You can give it data in two ways:

#### 1. **Query Builder or Eloquent Builder**

Pass a query where you select exactly two fields:

- `from_id`: the starting point
- `to_id`: where it points to

**Example:**

```php
Model::select('id as from_id', 'parent_id as to_id')
```

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--1"><div class="overflow-y-auto p-4" dir="ltr"></div></div>#### 2. **Array or Collection**

You can pass an array or a Laravel collection of pairs:

- As named keys:

```
[
    ['from_id' => 1, 'to_id' => 2],
    ['from_id' => 2, 'to_id' => 3],
    ['from_id' => 3, 'to_id' => 1],
]
```

- Or just plain arrays:

```
[
    [1, 2],
    [2, 3],
    [3, 1],
]
```

---

### What It Does

It runs a recursive SQL query to find **all loops** — meaning chains where something eventually points back to itself.

This is useful if you want to prevent circular references that could cause bugs or infinite loops in your system.

---

### What It Returns

It returns a list of found loops. Each loop is shown from the perspective of each node inside the loop.

**Output format (same as `DB::select`):**

```
[
	{
    	"root_id": 3,
        "path": "{5,8,3}"
    },
    {
    	"root_id": 5,
        "path": "{8,3,5}"
    },
    {
    	"root_id": 8,
        "path": "{3,5,8}"
    },
    ...
]
```

Each item means:

- `root_id`: the node where the search started
- `path`: the full loop path it found (as a string like a PostgreSQL array)