11
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravel】Eloquentのスコープでcould not be converted to stringが出たときの話

Last updated at Posted at 2018-10-02

こんな感じのソースを書いていた時のこと。

##やりたいこと
・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);
        });
    }
11
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?