контракт это реализация функционала
сервис-провайдеры это способы доступа
фасады это способы доступа
// если предполагать, что количество элементов в подмассивах одинаково, то:
if (empty($_POST)) {
return;
}
$names = array_keys($_POST);
$count = count($_POST[$names[0]]);
for ($i = 0; $i < $count; $i++) {
$id = null;
$data = [];
foreach ($names as $name) {
$value = isset($_POST[$name][$i]) ? $_POST[$name][$i] : null; // вообще, тут лучше выдавать ошибку, а не null
if ($name === 'ID') {
$id = $value;
} else {
$data[$name] = $value;
}
}
if (!empty($id) && !empty($data)) {
$wpdb->update('tableName', $data, ['ID' => $id]);
}
}
$customers = Customer::find()
->select([
'{{customer}}.*', // select all customer fields
'COUNT({{order}}.id) AS ordersCount' // calculate orders count
])
->joinWith('orders') // ensure table junction
->groupBy('{{customer}}.id') // group the result to ensure aggregation function works
->all();
// еще добавить надо public $ordersCount; в модель.
const categories = [
{ id: 1, name: 'name 1', parent: null },
{ id: 2, name: 'name 2', parent: 1 },
{ id: 3, name: 'name 3', parent: 6 },
{ id: 4, name: 'name 4', parent: 5 },
{ id: 5, name: 'name 5', parent: 6 },
{ id: 6, name: 'name 6', parent: null },
{ id: 7, name: 'name 7', parent: null }
];
function buildTree(items, parent) {
parent = parent || null;
let result = [];
items.forEach((item) => {
if (item.parent === parent) {
result.push(item);
item.children = buildTree(items, item.id);
if (!item.children.length) {
delete item.children;
}
}
});
return result;
}
// todo: не обходить уже добавленные
console.log(buildTree(categories));