类Illuminate \ Database \ Query \ Builder的对象无法转换为字符串

时间:2016-11-02 11:51:44

标签: php laravel laravel-5

我正在控制器中创建功能,我想附加用户和他的订单。首先,我在两个模型UNQUOTEDUser之间建立关系。

这是Orders模型中的功能:

User

这是public function orders(){ return $this->belongsToMany('App\Orders', 'user_orders', 'user_id', 'order_id'); } 模型中的功能:

Orders

这是新表public function users(){ return $this->belongsToMany('App\User', 'user_orders', 'order_id', 'user_id'); } ,我希望用我之前提到的这种关系附加用户订单:

user_orders

最后,这是我获取带有请求和订单ID的用户名的功能,并尝试将订单附加到给定用户。

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUserOrdersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
       Schema::create('user_orders', function (Blueprint $table) {

            $table->increments('id');

            /*$table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users');

            $table->integer('order_id')->unsigned();
            $table->foreign('order_id')->references('id')->on('orders');*/

            $table->integer('user_id');
            $table->integer('order_id');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('user_orders');
    }
}

我还检查了我是否获得了正确的用户名和订单ID,并且代码的前两行工作正常,但是当我尝试附加订单时,我收到此错误:

public function makeOrder(Request $request, $id){

        $user = User::where('name', $request['username'])->first();

        $findorder = Orders::find($id);


        $user->orders()->detach();
        $user->orders()->attach(Orders::where('id', $findorder))->first();


        return redirect()->back();

    }

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您应该获得第一个对象然后获取ID:

$user->orders()->attach(Orders::where('id', $findorder)->first()->id);

您应该将ID传递给attach()方法,但不能传递给集合或对象。

<强>更新

似乎$findorder是订单ID,所以只需执行此操作:

$user->orders()->attach($findorder);

答案 1 :(得分:0)

问题很简单。即这一行:

$user->orders()->attach(Orders::where('id', $findorder))->first();

,更具体地说:

Orders::where('id', $findorder)

目前,这将返回一个Model对象,该对象没有(也不应该)实现__toString方法。

长话短说,在Orders::where('id', $findorder)添加->first()之后或者你需要获得的任何内容。

有关附加/分离的详细信息,请参阅here