集合在 Tinker 中按预期工作,但在 Controller 中我得到 BadMethod

Collection working as expected in Tinker, but in Controller I get BadMethod

我 运行 我想的太简单了,我只是想多了。我在我的 Tinker 会话中 运行 以下命令,它按预期工作:

   $game = Games::find(1);
[!] Aliasing 'Games' to 'App\Models\Games' for this Tinker session.
=> App\Models\Games {#4386
     id: 1,
     user_id: 1,
     title: "Test Game",
     description: "This is a test of the game function",
     max_players: 8,
     deck: "default",
     type: "Golf",
     privacy: "Public",
     current_player: null,
     status: "pending",
     deleted_at: null,
     created_at: "2020-12-18 22:02:17",
     updated_at: "2020-12-18 22:02:17",
   }
>>> $game->players()->get();
=> Illuminate\Database\Eloquent\Collection {#4322
     all: [
       App\Models\User {#4384
         id: 1,
         name: "mark",
         email: "test@test.com",
         username: "user",
         role: null,
         email_verified_at: null,
         created_at: "2020-12-18 22:02:08",
         updated_at: "2020-12-18 22:02:08",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {#4168
           games_id: 1,
           user_id: 1,
         },
       },
     ],
   }

我基本上在我的控制器中放置了完全相同的代码来拉出游戏中的玩家列表:

    $game = Games::find($game);
    $players = $game->players()->get();

我在到达路线时得到了这个:

Method Illuminate\Database\Eloquent\Collection::players does not exist.

我很困惑为什么这在控制器中不起作用,如果它在 Tinker 中工作得很好。

感谢您的帮助!

$game = Games::find($game);

如果您将单个 ID 传递给 find,它将 return 一个 Game 模型或 null。但是,如果您传递一个 id 数组(即使它是一个长度为 1 的数组)或一个模型(出于某种原因),它将 return a Collectionnull.

在您的修补程序会话中,试试这个,您将抛出相同的错误。

$game = Games::find(1);
$game = Games::find($game);
// or
$game = Games::find([1]);

$players = $game->players()->get();

find() 的正常用法是传递一个 id,它将 return 该 id 的模型实例。但是,如果您传入数组或实现 \Illuminate\Contracts\Support\Arrayable 的对象,它将 return 所有找到的实例的 Collection

你的控制器代码是这样的:

$game = Games::find($game);

如果这里传递给find()$game值是一个数组,它将return一个Collection使用数组中的id找到的所有模型。

这里的另一个偷偷摸摸的问题是如果传递给 find()$game 值是一个模型实例。在这种情况下,这条语句将return一个Collection,因为模型实现了上面提到的Arrayable契约。

因此,当您调用 find() 并传入模型时,它将对该模型调用 toArray(),尝试为数组中的每个值 return 查找记录, return 找到的所有记录中的 Collection

在任何一种情况下,$game 现在都是 Collection,当您尝试调用 $game->players() 时会收到错误消息,因为 players() 方法确实集合中不存在。