前書き#
thinkphp は簡単だと言っても本当に簡単で、面倒だと言っても本当に面倒です。
公式ウェブサイトのディスカッションでは、問題だけでなく答えがありません。
なぜ多対多の関連で field () が機能しないのかわかりません。しばらく探しても多対多の問題に関する情報が見つかりませんでした。
ここでは、cards を例にとり、id、des、status のみを表示します。
解決策を記録します。
多対多関連のフィールド表示制限の 2 つの方法#
最初は方法 1 を使用しましたが、メインテーブルのフィールドが増えると、1 つずつ表示するのは面倒です。関連テーブルのフィールドのみを制限する方法を考えました。
最初は他の人がこのように書いても成功しませんでした。$v->getRelation ('cards')->visible (['id','des','status']); と表示されました。
エラーメッセージ「Call to a member function visible () on array」が表示されました。
$v->getRelation ('cards') を出力してみると、これが配列であることがわかりました。最初は foreach ループで visible を使用しようとしました。
それから collection () でラップしてみることにしました。成功しました。
<?php
public function index()
{
$list = $this->model
->with('cards')
->select();
foreach ($list as $k => $v){
//TODO データ表示の制限
//方法1
$v->visible(['id','name','cards.id','cards.des','cards.status']);
//方法2
collection($v->getRelation('cards'))->visible(['id','des','status']);
//同様にhiddenでフィールドを非表示にすることもできます
$v->hidden(['cards.pivot']);
}
}
多対多の wherePivot フィルタ条件#
public function cards()
{
//statusが0より大きい関連情報のみ表示
return $this->belongsToMany('app\admin\model\PersonalCard','app\admin\model\GroupCard','cardID', 'groupID')
->wherePivot('status','>',0);
}