こんな感じのソースを書いていた時のこと。
##やりたいこと
・GroupとGroupUserというモデルがあり、1対多の関係
・ログイン中のユーザが所属してるグループを取得したい
##コード
Group.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Group extends Model
{
/**
* グループに所属するユーザのリレーション定義(1対多)
*
* @return \App\GroupUser
*/
public function groupUsers()
{
return $this->hasMany('\App\GroupUser');
}
/**
* ユーザが所属するグループを取得するスコープ
*
* @param int $user_id
* @return \App\GroupUser
*/
public function scopeAffiliatedGroups($user_id)
{
return $this->whereHas('groupUsers', function($query) use($user_id)
{
$query->where('user_id', '=', $user_id);
});
}
}
##結果
実行してみると…。
ErrorException Object of class Illuminate\Database\Eloquent\Builder could not be converted to string
というエラーになってしまいます。
え??なんでBuilderなんて渡ってるんだ?と一瞬思いましたが、スコープはBuilderを第一引数に受け取ることを完全に忘れてました。
ちゃんとドキュメント読みましょうね…。
スコープパラメーターは**$query引数の後に定義**する必要があります。
Laravel 5.7 Eloquent:利用の開始
修正するとこんな感じになりました。めでたしめでたし
##修正後
Group.php(修正後)
/**
* ユーザが所属するグループを取得するスコープ
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $user_id
* @return \App\GroupUser
*/
public function scopeAffiliatedGroups($query, $user_id)
{
return $query->whereHas('groupUsers', function($query) use($user_id)
{
$query->where('user_id', '=', $user_id);
});
}