これが私がこのように表現した方法で完全に意味があるかどうかはわかりませんが、ここに行きます: 基本的に子列が null であるかどうかをチェックする再帰ループを php で作成する方法を見つけようとしています - その子要素列が持っている場合null 値の場合、その列の値を持つ親が見つかるまで親 ID を使用して祖先を再帰的に調べ、その親の値を元の子の列に入れます。私はphpを使い始めたばかりなので、これには絶対に困惑していますが、データベースとmysqlについてしっかりと理解しています。ヘルプとコード例は素晴らしいでしょう。
2 に答える
隣接リスト モデルを使用して階層データを保存することに関する警告: テーブルの作成と更新の容易さと引き換えに、データを再び取得する際の効率が低下します。私は自分のプロジェクトで個人的にClosure Tablesを使用しました。そこにデータを取得する方法とそれらを更新する方法を理解するのは非常に困難でしたが、データを再び取得するのははるかに効率的だったからです。Closure Tables がある場合、1 つのクエリを使用して、情報を持つノードのすべての親のリストを取得し、ORDER BY Distance LIMIT 1 を使用して、回答に必要な親だけを取得できます。ネストされたセットを使用することもオプションになる可能性がありますが、私はそれらについてあまり知りません。続行する前に、それらを調べてオプションを検討する必要があります。
これは、現在持っている隣接リスト用です。
$target = 4; //whatever ID
$db = new mysqli(HOST, USERNAME, PASSWORD, DATABASE);
if($db->connect_errno > 0){
die('Unable to connect to database [' . $db->connect_error . ']');
}
$statement = $db->prepare("SELECT ParentID, Audience FROM things WHERE ChildID = ?");
$audience = NULL;
$ChildID = $target; // starts as same value
while(!isset($audience) || !isset($ChildID)) { //This assumes that the top ParentID is null; you might have to adjust it
$statement->bind_param('i', $ChildID);
$statement->execute();
$result = $statement->get_result();
while($row = $result->fetch_assoc()){
if(!isset($row['Audience']) && !isset($audience)) {
$ChildID = isset($row['ParentID'])?$row['ParentID']:NULL;
} else {
$audience = $row['Audience'];
}
}
$result->free();
}
if(isset($audience)) {
if($target == $ChildID) { //it was found on that first try
echo $audience.' was found for '.$target;
} else {
$statement = $db->prepare("UPDATE things SET Audience = ? WHERE ChildID = ?");
$statement->bind_param('si', $audience, $target);
$statement->execute();
echo $audience.' was set for '.$target;
}
} else {
echo 'No audience was found or set for '.$target;
}
$db->close();
bind_param の最初のパラメーターは、バインディングの型 (string、integer、decimal、blob) を気にすることに注意してください。あなたはそれを調べなければならないかもしれません。
テーブル/フィールドの例を提供してください。1 つのテーブルを意味しているのか、複数のテーブルを意味しているのかわかりませんでした。
PHPコードは次のようになります(クエリは疑似コードです)
function updateChild($ChildID,$ParentID=-1)
{
//use mysqlquery or whatever
if($ParentID==-1)
select field_value,parent_id from mytable where rowid=$ChildID;
else
select field_value,parent_id from mytable where parentid=$ParentID;
$candidate_value=$row['field_value'];
$fallback_parent=$row['parent_id']
if ( is_null($candidate_value))
updateChild($ChildID, $fallback_parent)
else
update mytable set field_value=$candidate_value where $ChildID=$ChildID
}
念のため、現在のフィールド値とparentIDを取得することから始めます。null であることが判明した場合は、同じ関数を再度呼び出して、子または行 ID と次の親を渡してチェックします。親が正常であることが判明した場合は、ずっと渡されてきた子の値を使用して更新されます。上記のコードは、最初の試行で値が実際にある場合、子の値を「それ自体」で更新することに注意してください。そのため、parentid が -1 であるかどうかを確認して修正する必要があります。